2015-12-22 85 views
0

我想在Unix中創建一個腳本來解析嵌套的XML。下面的示例:在AIX中最簡單的嵌套XML解析

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<deployments> 
    <appName>apptest</appName> 
    <envVariable>app</envVariable> 
    <fileSourceFolder>/sourceTest</fileSourceFolder> 
    <fileBackupFolder>/testbackup</fileBackupFolder> 
    <requireRestart>false</requireRestart> 
    <restartCommandPath>bin</restartCommandPath> 
    <deployment-files> 
     <deployment-file> 
      <deploymentFolder>deployment-folder</deploymentFolder> 
      <fileName>test-file</fileName> 
     </deployment-file> 
    </deployment-files> 
    <restart-commands> 
     <restart-command> 
      <commandName>./appstop</commandName> 
     </restart-command> 
     <restart-command> 
      <commandName>./appstart</commandName> 
     </restart-command> 
    </restart-commands> 
</deployments> 

我需要通過部署,文件重啓命令元素進行迭代。我讀了關於使用Perl和安裝的版本是5.8.8。但是,由於缺少庫,我無法在perl中使用TWIG和其他XML文件。我讀過其他的東西,比如xml_grep,xmllint等,但是這些並沒有安裝在我使用的機器上,我無法手動安裝這些東西,甚至因爲很多約束而請求它。

我已經嘗試使用XML :: Simple,例如http://interoperating.info/courses/perl4data/node/26,但仍然沒有用。

請告知如何爲此創建最簡單的perl或shell腳本,並請提供參考。我在shell腳本中仍然是新手,並且我昨天才開始探索perl,所以我會感謝您的所有幫助。謝謝。

+0

你嘗試過任何東西嗎? – serenesat

+0

是的,我確實從互聯網上嘗試了很多東西。我試圖修改那些以滿足我的需求,但仍然不適合我的要求。我基本上是新的shell腳本,我只是昨天嘗試Perl,所以我真的需要幫助。非常感謝你的耐心提前 – NothingBox

+0

你能發表至少一件事情來表明你的努力嗎? – serenesat

回答

1

看,我知道你說'我不能安裝東西' - 但是你得到的問題是你試圖解析XML而沒有解析器,而且你使用的是7年前的perl版本那是生命的終結。 Perl 5.8.8 is end of life, and released in 2008

這並不是一個很好的解決方案的路線不管我們怎麼努力 - 使用解析器這成爲平凡簡單:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use XML::Twig; 

my $twig = XML::Twig -> new -> parse (\*DATA); 
foreach my $deployment_files ($twig -> get_xpath ('//deployment-file')) { 
    print $deployment_files -> first_child_text('deploymentFolder'), " => "; 
    print $deployment_files -> first_child_text('fileName'); 
    print "\n"; 
} 

foreach my $restart_command ($twig -> get_xpath ('//restart-command/commandName')) { 
    print $restart_command -> text,"\n"; 
} 

__DATA__ 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<deployments> 
    <appName>apptest</appName> 
    <envVariable>app</envVariable> 
    <fileSourceFolder>/sourceTest</fileSourceFolder> 
    <fileBackupFolder>/testbackup</fileBackupFolder> 
    <requireRestart>false</requireRestart> 
    <restartCommandPath>bin</restartCommandPath> 
    <deployment-files> 
     <deployment-file> 
      <deploymentFolder>deployment-folder</deploymentFolder> 
      <fileName>test-file</fileName> 
     </deployment-file> 
    </deployment-files> 
    <restart-commands> 
     <restart-command> 
      <commandName>./appstop</commandName> 
     </restart-command> 
     <restart-command> 
      <commandName>./appstart</commandName> 
     </restart-command> 
    </restart-commands> 
</deployments> 

沒有一個解析器,你先......必須寫一個解析器。你可以做到這一點 - 規範是明確的。但實際上,有幾個好的XML解析器可以隨時使用並且經過測試和工作,這沒什麼意義。但即使你這樣做了,你也會跑上一個7歲的口譯員。執行perl的源代碼版本並不難,並且安裝在其他位置。

所以我會建議正確答案在這裏涉及請求必要的元素做一個體面的工作。你不會指望一個木匠用錘子砸碎你的錘子,因爲他不會爲了購買一把螺絲刀而煩惱,現在你願意嗎?

+0

我嘗試過使用樹枝,但我總是遇到無法在@INC錯誤中找到XML/Twig.pm。最初的計劃是提供我們爲部署團隊製作的任何腳本,以自動複製/備份文件和重新啓動應用程序。如果需要額外的庫來執行此操作(例如Xml解析器庫),則會首先處理一系列請求並進行大量解釋。管理服務器中的修改非常嚴格。無論如何,我仍然會盡力在我的測試機器上做任何事情,並希望它可以在產品上實施。非常感謝您的幫助。 – NothingBox

+0

變更控制是關於控制變更。沒關係。你有一個改變和一個理由去實現它。這是關於製作可重複的可支持代碼 - 這是一個良好的理由來做出改變。 – Sobrique

+0

謝謝@Sobrique。 :) – NothingBox