2011-08-31 123 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替代品。 –