2011-12-07 45 views
3

我想在使用XML :: Simple的Perl中解析一些XML。XML ::簡單的Perl沒有檢測到所有元素

的XML如下格式:

<result> 
    <doc> 
     <field name="title">Sample Title</field> 
     <field name="content">Content 1</field> 
     <field name="content">Content 2</field> 
     . 
     . 
     . 
     <field name="content">Content n</field> 
    </doc> 
    </result> 

使用XML ::簡單的我試圖解析這個和打印標題和所有的內容。問題是隻有最後一個內容項目正在打印。我決定用戶Dumper,這是它返回的內容:

$VAR1= { 
    'result'=> { 
      'doc' => [ 
       { 
        'field' => {      
           'content' => { 
              'content' => 'Content n' 
              }, 
           'title' => { 
              'content' => 'Sample Title' 
              } 
           } 
         } 

只顯示每個doc元素的最後一個內容項目。這有什麼理由嗎?我能做些什麼來檢測所有內容項目?

編輯:下面的代碼:

my $url = "http://www.testurl.com/test.xml"; 
my $content = get $url; 
die "Couldn't get XML" unless defined $content; 

my $xml = new XML::Simple; 
my $xmlData = $xml->XMLin($content); 
print Dumper($xmlData); 
+2

發佈相關代碼。特別是對XML :: Simple實例和打印的初始化。 – FailedDev

+0

好吧,我已經添加了代碼。內容是通過HTTP在內部存儲的XML文件。 –

+0

那麼http://www.testurl.com/test.xml指向你的.xml的權利? – FailedDev

回答

8

每莢:

注1: 'KeyAttr' 默認值[ '名' ,'key','id']。如果您不想摺疊輸入或展開輸出,則必須將此選項設置爲空列表以禁用該功能。

它將「名稱」作爲ID型字段並將元素摺疊在一起。

perl -MXML::Simple -MData::Dumper 

my $raw = <<XML_SAMPLE; 
<result> 
    <doc> 
     <field name="title">Sample Title</field> 
     <field name="content">Content 1</field> 
     <field name="content">Content 2</field> 
     . 
     . 
     . 
     <field name="content">Content n</field> 
    </doc> 
    </result> 
XML_SAMPLE 

my $xml = new XML::Simple; 
my $xmlData = $xml->XMLin($raw, KeyAttr => []); 
print Dumper($xmlData); 

__END__ 
$VAR1 = { 
      'doc' => { 
        'content' => ' 
     . 
     . 
     . 
     ', 
        'field' => [ 
           { 
           'content' => 'Sample Title', 
           'name' => 'title' 
           }, 
           { 
           'content' => 'Content 1', 
           'name' => 'content' 
           }, 
           { 
           'content' => 'Content 2', 
           'name' => 'content' 
           }, 
           { 
           'content' => 'Content n', 
           'name' => 'content' 
           } 
          ] 
       } 
     }; 
+0

非常感謝,這完美的作品。 –

+0

不用擔心,我花了一些時間在夏天搜索下來,我本人;-) – BRFennPocock

1

KeyAttr

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

$Data::Dumper::Sortkeys=1; 

my $str = ' 
<result> 
    <doc> 
     <field name="title">Sample Title</field> 
     <field name="content">Content 1</field> 
     <field name="content">Content 2</field> 
     <field name="content">Content n</field> 
    </doc> 
</result> 
'; 

print Dumper(XMLin($str, KeyAttr => 'content')); 

__END__ 

$VAR1 = { 
      'doc' => { 
        'field' => { 
           'Content 1' => { 
              'name' => 'content' 
              }, 
           'Content 2' => { 
              'name' => 'content' 
              }, 
           'Content n' => { 
              'name' => 'content' 
              }, 
           'Sample Title' => { 
               'name' => 'title' 
               } 
          } 
       } 
     }; 
0

XML :: Simple將名稱作爲重複xml元素的唯一標識符。嘗試切換測試的緣故你的'名字'屬性爲'標籤'。我希望你會看到你期望的自卸車輸出。給XML :: Fast看一下,我發現它更加一致,更不用說至少快一個數量級了。

+0

僅供參考 - 任何速度差異很可能是由於XML ::簡單回落到XML :: SAX :: PurePerl分析器。安裝XML :: SAX :: Expat(XS)可以加快速度並修復一些解析錯誤。 –

相關問題