XML :: Twig xpath栏

Nat*_*enn 2 perl xpath xml-twig

我正在使用XML :: Twig来处理这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<termEntry>
    <langSet lang="en">
        <ntig>
            <termGrp>
                <term>trail</term>
                <termNote type="partOfSpeech">noun</termNote>
            </termGrp>
            <descrip type="context">Like in a forest</descrip>
        </ntig>
    </langSet>
</termEntry>
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码来处理它:

use strict;
use XML::Twig;

my $twig_handlers = {
    termEntry => sub { for my $node($_[1]->findnodes('.//descrip|.//termNote')){print $node->text;}},
};

my $twig= new XML::Twig(
                                TwigRoots           => { termEntry => 1},
                                TwigHandlers        => $twig_handlers,
);

$twig->parsefile('C:\Users\me\file.xml');
Run Code Online (Sandbox Code Playgroud)

代码失败了:

error in xpath expression .//descrip|.//termNote around descrip|.//termNote at 
C:\Users\nate\Desktop\test.pl line 6
Run Code Online (Sandbox Code Playgroud)

我一直在尝试不同的东西,任何时候我都使用'|' xpath中的字符会破坏程序.它在http://www.xpathtester.com上工作正常(我认为我用'//'替换'.').有想法该怎么解决这个吗?

Zai*_*aid 7

有多种方法可以做到这一点:

use strict;
use warnings;
use XML::Twig;

sub process {
  my ( $twig, $elt ) = @_;
  print $_->text, "\n" for ( $elt->findnodes( './/descrip' ),
                             $elt->findnodes( './/termNote' ) );
}

my $xml = XML::Twig->new( twig_roots => { termEntry => \&process } );

$xml->parse( <<XML );
<?xml version="1.0" encoding="UTF-8"?>
<termEntry>
    <langSet lang="en">
        <ntig>
            <termGrp>
                <term>trail</term>
                <termNote type="partOfSpeech">noun</termNote>
            </termGrp>
            <descrip type="context">Like in a forest</descrip>
        </ntig>
    </langSet>
</termEntry>
XML
Run Code Online (Sandbox Code Playgroud)

产量

Like a forest
noun
Run Code Online (Sandbox Code Playgroud)