2011-03-25 128 views
3

我想從XML文件中提取兩個特定屬性的值,其結構在下面;使用Perl解析XML文件

<environment> 
    <applications> 
     <application1> 
      <app-config> 
      <server host="boxA" port="1234"/> 
      </app-config> 
     </applicaitons> 
</environment> 

我希望能夠讀取屬性「主機」和「端口」的值。

我已經嘗試了一段代碼,但這不適用於我。

#!/usr/local/bin/perl -w 

use XML::XPath; 

my $file = "configuration.xml"; 
my $xp = XML::XPath->new(filename => $file); 

my $hname = $xp->find('/environment/applications/application1/app-config/server/@host'); 
my $pnumber = $xp->find('/environment/applications/application1/app-config/server/@port'); 


print $hname; 

但是,當我運行此命令時,這不會返回任何輸出。

在此先感謝

+6

我只想說,你是一個呼吸新鮮空氣。感謝您使用XML解析器解析XML,而不是使用正則表達式! – CanSpice 2011-03-25 16:40:53

回答

0

使用XML:簡單。它很簡單。

嘗試下面的代碼:

use strict; 
use warnings; 
use XML::Simple; 
my $xml = XMLin(<<XML); 
<environment> 
    <applications> 
     <application1> 
      <app-config> 
      <server host="boxA" port="1234"/> 
      </app-config> 
     </applicaitons> 
</environment> 
XML 
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n"; 
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n"; 

你的XML片段,你會得到一個錯誤,如:

mismatched tag at line 7, column 9, byte 159 at C:/Perl64/lib/XML/Parser.pm line 187 

,因爲它告訴我,有一個不匹配的標籤,我開始檢查的XML直到我找出畸形的問題,所以我一直在處理XML錯誤,直到我想出:

use strict; 
use warnings; 
use XML::Simple; 
my $xml = XMLin(<<XML); 
<environment> 
    <applications> 
      <app-config> 
      <server host="boxA" port="1234"/> 
      </app-config> 
     </applications> 
</environment> 
XML 
print $xml->{"applications"}{"app-config"}{"server"}{"host"} . "\n"; 
print $xml->{"applications"}{"app-config"}{"server"}{"port"} . "\n"; 

,現在的計劃產生預期:

boxA 
1234 

正如你所看到的,它幫助我很快發現了錯誤的根源,並沒有額外的配置XML ::簡單做了一個非常自然的映射到Perl的哈希說我們都很喜歡:-) ...簡單。

+4

這是爲了簡單的XML(並且大多數XML不夠簡單) – Quentin 2011-03-25 15:53:47

+0

好吧,我通過反對票的提示來闡述。我並不反對@David,但XML :: Simple可以很好地適用於很多XML,如果您需要,您可以開始編寫這些選項並使用更多的XML。如果您正在尋求擴展或使用一些非常複雜的XML,那麼可能需要遷移到其他模塊。但是,看起來這很容易! – harschware 2011-03-26 03:51:11

+0

我懷疑downvotes是因爲切換XML模塊不能解決問題(這是XML格式錯誤)。 – Quentin 2011-03-26 07:17:09

4

您的XML無效!修復它,它工作正常。

$ perl test.pl 
boxA 
+1

更正您的應用程序標籤以及關閉application1標籤。 – 2011-03-25 16:07:12

4

總是,總是用你的perl腳本啓動;

use strict; 

而且在調試時也做到這一點;

use warnings; 

這會告訴你,你的XML格式不正確。

修復你的XML,它會工作!

+0

實際上,即使沒有設置警告/嚴格,它總是顯示錯誤。 – 2011-03-25 17:29:15

+0

我確實錯過了shebang系列中的-w開關,公正的警察。我堅持使用嚴格的評論,雖然;-) – Roger 2011-03-25 23:13:38

2

</applicaitons>應該拼寫爲</applications> 將其替換爲您的XML文檔。 來源很好。

+0

哈哈哈。所以看來我的xpath是錯誤的,而不是XML本身。發現了下劃線和短劃線之間的差異。謝謝大家的幫助! ;) – sandster007 2011-03-25 16:05:16

+1

在你問的問題中,你的XML是錯誤的,修正後,你現有的XPath就沒有問題了。無論哪種方式,很高興你排序。 – Roger 2011-03-25 23:11:59