2011-08-31 139 views
3
<cov> 
    <item> 
     <valo></valo> 
     <valt></valt> 
     <valtr></valtr> 
    </item>    
    <item> 
     <valo></valo> 
     <valt></valt> 
     <valtr></valtr> 
    </item>    
    <item> 
     <valo></valo> 
     <valt></valt> 
     <valtr></valtr> 
    </item>    
</cov> 

我試圖使用樹枝來循環valo和valtr爲每個項目 - 我該怎麼做?使用XML處理嵌套元素:: Twig

我有這個到目前爲止,但在子程序裏面,我怎麼才能指定正確的節點「瓦洛」?

my $t = XML::Twig->new(twig_handlers => {'cov/item' => \&item }); 
my $url; 
$t->parse($fileContent); 

sub item { 
    my ($t, $item) = @_; 
    print $item->text . "\n"; 
} 

回答

3

這裏有一個處理程序,它顯示了一種方法來檢查cov/item節點的孩子:

sub item { 
    my ($t, $item) = @_; 

    my @kids = $item->children; 
    for my $kid (@kids) { 
     warn "valo is: " . $kid->text if $kid->name eq q{valo}; 
     warn "valtr is: " . $kid->text if $kid->name eq q{valtr}; 
    } 
} 

另一種方法是使用findnodes()和嫩枝的類似XPath的語法來定位的元素:

my $t = XML::Twig->new->parse($fileContent); 
for my $node ($t->findnodes('//valo')) { 
    warn "valo is: " . $node->text; 
} 

...或者對於完整的XPath語法,請使用XML :: Twig :: XPath代替:

my $t = XML::Twig::XPath->new->parse($fileContent); 
for my $node ($t->findnodes('//valo | //valtr')) { 
    warn "valo is: " . $node->text if $node->name eq q{valo}; 
    warn "valtr is: " . $node->text if $node->name eq q{valtr}; 
} 

有關這裏使用的方法的詳細信息,請參閱XML::Twig docs

+0

而不是爲每個元素做這個循環我們不應該使用xpath嗎? – user391986

+0

我添加了一些xpath替代品。 –