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をループしようとしています-これを行うにはどうすればよいですか?

これまでのところこれはありますが、サブルーチン内で正しいノード「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";
}
4

1 に答える 1

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};
    }
}

もう1つのアプローチは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ドキュメントを参照してください。

于 2011-08-31T16:15:07.143 に答える