2011-08-01 132 views
-1

我有一個有100個項目,如下面的XML格式如下解析XML和XML ::嫩枝

我想分析它,並提取數據1和數據2我怎麼能做到這一點與XML::Twig Perl模塊,

<Item> 
<data1> <data3> date </data3> </data1> 
<data2> data2 </data2> 

</Item> 
<Item> 
<data1> <date3> data22 </data3> </data1> 
<data2> data2 </data2> 
</Item> 
.... 
+3

這是不正確的XML,不能被標準化由XML解析器sed。如果您始終將「<\element>」更改爲「」,則無問題。閱讀http://search.cpan.org/~mirod/XML-Twig-3.38/Twig.pm後,你有什麼嘗試? – RedGrittyBrick

+0

-1聲稱它不是XML時是XML。 – tadmc

回答

4

您的XML不符合規範,因此解析器無法按原樣處理它。主要問題有:

  • XML是大小寫敏感的,所以Item別的東西比item
  • 關閉標籤用斜槓開始,而不是反斜線
  • 應該有頂級元素

解決這些問題,這段代碼的工作原理如下:

use strict; use warnings; 

use XML::Twig; 

my $data = <<END_DATA; 
<items> 
    <item> 
     <data1> data1 </data1> 
     <data2> data2 </data2> 
    </item> 
    <item> 
     <data1> data1 </data1> 
     <data2> data2 </data2> 
    </item> 
</items> 
END_DATA 


my $t = XML::Twig->new(
    twig_handlers => { 
     'item' => sub { 
      # process each item and print contents of dataN elements 
      print 
       $_->first_child_trimmed_text('data1'), "\t", 
       $_->first_child_trimmed_text('data2'),"\n"; 
     }, 
    }, 
)->parse($data); 
+0

感謝您的回答,對不起,我在您編寫答案的同時更新了我的問題。 – Rubin

+0

@Rubin - 您可以訪問像這樣的後代項目:'eval {$ _-> first_descendant('data3') - > trimmed_text}'。我認爲你最好的選擇是使用我發佈的示例並查看[XML :: Twig](http://search.cpan.org/perldoc?XML::Twig)文檔中的方法描述。 – bvr