<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>
我正在尝试使用twig来循环每个项目的valo和valtr - 我该怎么做?
到目前为止,我有这个,但在子程序中,我怎样才能指定正确的节点“valo”?
my $t = XML::Twig->new(twig_handlers => {'cov/item' => \&item });
my $url;
$t->parse($fileContent);
sub item {
my ($t, $item) = @_;
print $item->text . "\n";
}
答案 0 :(得分: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( )
和Twig的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。