2010-11-27 35 views
1

部分看起来是这样的:XML :: Twig忽略了一些元素?该XML的

<ipcEntry kind="1" symbol="A01B0013080000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"> 
    <textBody> 
     <title> 
      <titlePart> 
       <text>for working subsoil</text> 
      </titlePart> 
     </title> 
    </textBody> 
    <ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"> 
     <textBody> 
      <title> 
       <titlePart> 
        <text>Special implements for lifting subsoil layers</text> 
       </titlePart> 
      </title> 
     </textBody> 
     <ipcEntry kind="3" symbol="A01B0013120000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"> 
      <textBody> 
       <title> 
        <titlePart> 
         <text>Means for distributing the layers on the surface</text> 
        </titlePart> 
       </title> 
      </textBody> 
     </ipcEntry> 
    </ipcEntry> 
</ipcEntry> 

我的代码是:

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

my $twig_handlers = { 'ipcEntry' => \&ipcEntrySub }; 

my $file = 'A01B.xml'; 
my $twig= new XML::Twig(twig_handlers => $twig_handlers); 
$twig->parsefile($file); 
#$twig->print; 




sub ipcEntrySub { 

    my ($twig_obj, $element) = @_; 

    print $element->{'att'}->{'symbol'} . "\n"; 
print "Kind: $element->{'att'}->{'kind'}\n"; 
print $element->text . "\n"; 
print "###########################################\n"; 


    $twig_obj->purge; 

} 

好像我不能让文字:<text>Special implements for lifting subsoil layers</text> 我想它,因为<ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">有另一个子ipcEntry。我可以得到<text>Means for distributing the layers on the surface</text>

我在做什么错在这里?

感谢,

+1

你想要的输出是什么? – 2010-11-27 18:04:46

+0

基本上,打印所有的元素,以及每个元素的属性 snoofkin 2010-11-27 18:25:55

回答

6

从XML ::嫩枝文档:

刷新此方法不应被使用, 总是刷新树枝,而不是元素。

purge与“齐平” 相同,但不打印树枝。它 只是删除目前已完全解析的所有元素。

替换清除函数,使用delete函数以相反的顺序打印所有ipcEntry元素的文本,即。从最里面的ipcEntry元素开始。

sub ipcEntrySub { 
    my ($twig_obj, $element) = @_; 

    print $element->{'att'}->{'symbol'} . "\n"; 
    print "Kind: $element->{'att'}->{'kind'}\n"; 
    print $element->text . "\n"; 

    $element->delete; 
}