Xpath 不适用于 XML::Twig::XPath::Elt

Xpath is not working with XML::Twig::XPath::Elt

我关注XML。

<Path>
  <To>
    <My>
      <Node key="11">
        <ChildA>1A</ChildA>
        <ChildB key="Key1">1B</ChildB>
        <ChildC>
            <ChildD>ValD</ChildD>
        </ChildC>
      </Node>
      <Node key="22">
        <ChildA>2A</ChildA>
        <ChildB key="Key2">2B</ChildB>
        <ChildC>
            <ChildD>ValD</ChildD>
        </ChildC>
      </Node>
    </My>
  </To>
</Path>

我正在尝试使用 XML::Twig::XPath 解析此 xml。 以下是我使用 XPath 语法解析它并从中提取元素的代码。

use 5.010;
use strict;
use warnings FATAL => 'all';
use XML::Twig::XPath;  #Issue with this shit as this thing was up to data but XML::XPath was not installed. So I did cpanm XML::XPath
use XML::Twig;
use Data::Dumper;
my @xml;

$xml[0] = q|<Path>
  <To>
    <My>
      <Node key="11">
        <ChildA>1A</ChildA>
        <ChildB key="Key1">1B</ChildB>
        <ChildC>
            <ChildD>ValD</ChildD>
        </ChildC>
      </Node>
      <Node key="22">
        <ChildA>2A</ChildA>
        <ChildB key="Key2">2B</ChildB>
        <ChildC>
            <ChildD>ValD</ChildD>
        </ChildC>
      </Node>
    </My>
  </To>
</Path>|;

my $twig = XML::Twig::XPath->new(pretty_print => 'indented')->parse($xml[0]);

#Finding the whole Node, using xpath. This shit also works if you have Twig, not XPath.
my @constraint = $twig->findnodes('/Path/To/My/Node[@key="22"]');
say $constraint[0]->sprint;
say ref($constraint[0]);

my $child_key = $constraint[0]->find('//ChildB/@key');
say $child_key;

$constraint[0] 正确打印 XML 节点。

我希望 $child_key 是 Key2 但结果是 Key1Key2

我可能做错了什么?如果我进行完整的 XPath 搜索,它会给我正确的输出。

//ChildB/@key xpath 表达式意味着它从根元素开始并在任何元素中查找元素 ChildB 和属性 @key.

令人困惑的是你的树枝 $constraint[0] 没有 完全从树上拔下来。这就像完整文档树的某些部分的视图,所以 // 实际上是在完整的树中查找。它从文档的根开始,而不是 <Node key="22"> 元素。

您需要使用 ..

告诉您的 find 开始当前元素
#                                     V
my $child_key = $constraint[0]->find('.//ChildB/@key');

现在你的输出只有

Key2