Perl:无法使用 Twig::XPath 语法提取同级值

标签 perl xpath twig

最近我开始使用 XML::Twig::XPath 但该模块似乎无法识别 xpath 语法。 在下面的 XML 中,如果 PlcAndNm 节点的值为“ext_1”,我想要“Txt”节点的值

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <Document>
    <RedOrdrV03>
      <MsgId>
      <Id>1</Id>
      </MsgId>
      <Xtnsn>
        <PlcAndNm>ext_1</PlcAndNm>
        <Txt>1234</Txt>
      </Xtnsn>
      <Xtnsn>
        <PlcAndNm>ext_2</PlcAndNm>
        <Txt>ABC</Txt>
      </Xtnsn>
    </RedOrdrV03>
  </Document>
  <Document>
    <RedOrdrV03>
      <MsgId>
      <Id>2</Id>
      </MsgId>
      <Xtnsn>
        <PlcAndNm>ext_1</PlcAndNm>
        <Txt>9876</Txt>
      </Xtnsn>
      <Xtnsn>
        <PlcAndNm>ext_2</PlcAndNm>
        <Txt>DEF</Txt>
      </Xtnsn>
    </RedOrdrV03>
  </Document>
</root>

我尝试过whit表达式//Xtnsn[PlcAndNm="ext_1"]/Txt,但收到错误 这是代码:

use XML::Twig::XPath;
my $subelt_count = 1;
my @processed_elements;
my $xmlfile = 'c:/test_file.xml';
my $parser = XML::Twig->new(
 twig_roots    => { 'RedOrdrV03' => \&process_xml } ,
 end_tag_handlers => { 'Document' },
);

$parser->parsefile($xmlfile);

sub process_xml {
  my ( $twig, $elt ) = @_;
  push( @processed_elements, $elt );

  if ( @processed_elements >= $subelt_count ) {
    my $MsgId = $twig->findvalue('RedOrdrV03/MsgId/Id');
    my $Xtnsn_Txt1 = $twig->findvalue('//Xtnsn[PlcAndNm="ext_1"]/Txt');
    print "MsgId: $MsgId - Xtnsn_Txt1: $Xtnsn_Txt1\n";
  }
  $_->delete for @processed_elements;
  @processed_elements = ();
  $twig->purge;
}

有没有简单的方法使用xpath获取值? 我知道可能性是这样的:

my $Xtnsn_Txt1 = $twig->first_elt( sub { $_[0]->tag eq 'PlcAndNm' && $_[0]->text eq 'ext_1' })->next_sibling()->text();

但我更喜欢使用最简单的 XPath 语法,

预先感谢您的帮助!

最佳答案

你可以使用这个:

my $Xtnsn_Txt1 = $twig->findvalue('//Xtnsn/PlcAndNm[string()="ext_1"]/../Txt');

关于Perl:无法使用 Twig::XPath 语法提取同级值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61475973/

相关文章:

php - 如何将数组从 Symfony 2 Controller 传递到 TWIG 模板?

php - Symfony 中的操作系统独立供应商路径

arrays - 如何在perl中合并两个数组,从每个数组交替值

java - 访问现有属性返回 null

regex - 使用 perl 将 XML 转换为 JSON

xslt - 。[nodeTest]表达式不起作用

xpath - 运行 Jmeter 脚本时出现 Transformer 异常

php - Slim Framework -> 创建 XML 输出

ios - IO::Socket::INET 返回一个空套接字

shell - 如何打印两个模式之间的行,包含或排除(在 sed、AWK 或 Perl 中)?