XML :: Twig xpath bar - PullRequest
       27

XML :: Twig xpath bar

2 голосов
/ 20 ноября 2011

Я использую 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>

Я использую следующий код для его обработки:

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');

Код не работает с:

error in xpath expression .//descrip|.//termNote around descrip|.//termNote at 
C:\Users\nate\Desktop\test.pl line 6

Я пробовал разные вещи, и каждый раз, когда я использую '|' Символ в xpath нарушает работу программы. Это прекрасно работает на http://www.xpathtester.com (думал, что я заменю '.' На '//'). Есть идеи как это исправить?

Ответы [ 2 ]

7 голосов
/ 20 ноября 2011

Существует несколько способов сделать это ™:

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

выход

Like a forest
noun
2 голосов
/ 20 ноября 2011

Из документации :

«Выражения XPath ограничены использованием дочерней и дочерней осей (на самом деле вы не можете указать ось), и предикаты не могут быть вложенными. Вы можете использовать функцию string или string () (кроме триггеров twig_roots)»

Ваш XPath правильный. Возможно, вы захотите попробовать: XML :: Twig :: Xpath, тогда вы получите полную мощность Xpath:)

...