2010-11-05 151 views
1

我有一個Perl腳本,它讀取沒有內容的XML文件,只讀取元素中的屬性。如何使用Perl的XML :: Simple獲取XML元素的屬性?

像這樣:

<league> 
<game name="bla"/> 
</league> 

現在我試圖讓遊戲中的屬性 '名'。

我試過使用$xml->{league}->{game}->{name}$xml->{league}->{game}->['name']但他們都不工作。關於哈希問題的一些東西。

有沒有人可以幫助我獲得價值?

+1

顯示您的程序。 – 2010-11-05 17:20:15

回答

4

那麼從您發佈的XML,我得到這個:

Entity: line 3: parser error : Opening and ending tag mismatch: league line 0 and leage 

它甚至不似乎是一個嚴格的/警告的問題,因爲當我的評論我的USUW出出現。

但是,如果你有正確的標籤,這應該工作:

$xml->{game}{name}; 

如果我打電話XMLinKeepRoot => 1,你會在找到它:

$xml->{league}{game}{name}; 

如果您有麻煩定位如何讀取數據,請執行以下操作:

use 5.010; 
use strict; 
use warnings; 
use Data::Dumper; 
use XML::Simple; 

my $xml = XMLin($input); 
say Data::Dumper->Dump([ $xml ], [ '$xml' ]); 

而且n使用所提供結構的路徑。


注: 「不是數組引用在」 即使不打開了警告:

$xml->{league}->{game}->['name']; 

應該已經死亡。 ['string']是以字符串'string'作爲唯一元素的數組的參考。而且,如果$xml->{league}{game}數組,它將因非數字錯誤而死亡,因爲字符串不會處理數組。

+0

$ xml - > {game} {name};給我一個: 不是parser.pl第22行的HASH參考。 – baklap 2010-11-05 15:06:39

+1

@baklap,參見Data :: Dumper的建議。 – Axeman 2010-11-05 15:27:59

+0

謝謝,把它輸出到一個文件。但我明白了什麼是錯的。我發佈的XML只是一個簡單的例子,而不是真正的XML。我的錯。 出錯的事情是有些是{元素}的東西,有些是['名稱'](不知道有什麼區別)我可以打印{元素}的東西,但[['名字']的東西不可打印,我不知道該怎麼做... – baklap 2010-11-05 15:30:01

4

我通常我實例化XML ::簡單對象是這樣的:

use XML::Simple ':strict'; 
my $xs = XML::Simple->new(KeepRoot => 1, KeyAttr => 1, ForceArray => 1); 

它允許結構是單一的,可能多個子元素之間是一致的。有了這些設置,該代碼就會獲取你的價值:

#!/usr/bin/perl 
use strict; 
use warnings; 
use XML::Simple ':strict'; 

my $xs = XML::Simple->new(KeepRoot => 1, KeyAttr => 1, ForceArray => 1); 
my $ref = $xs->XMLin('data.xml'); 
print $ref->{league}[0]{game}[0]{name}; 

我又增加了遊戲標籤,並在聯賽標籤作爲一個例子中的屬性,這是XML:

<league name="baz"> 
    <game name="bla"/> 
    <game name="foo"/> 
</league> 

和數據: :Dumper的輸出是:

$VAR1 = { 
      'league' => [ 
         { 
         'game' => [ 
            { 
            'name' => 'bla' 
            }, 
            { 
            'name' => 'foo' 
            } 
           ], 
         'name' => 'baz' 
         } 
        ] 
     }; 
+0

設置'KeyAttr => 1'沒有什麼意義。也許你的意思是'KeyAttr => {}'。 – 2010-11-07 20:21:24

+1

KeyAttr => [],相反,我猜'1'會破壞名爲'1'的XML標籤 – MkV 2010-11-14 02:20:53