gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:02:21 24 4
gpt4 key购买 nike

我有以下 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 是 键2 但结果是 Key1Key2

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

最佳答案

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

令人困惑的是,您的 Twig $constraint[0]不是 完全从树上取下来。这就像完整文档树的某些部分的 View ,所以 //实际上看起来是完整的树。它从文档的根目录开始,而不是从 <Node key="22"> 开始。元素。

你需要告诉你的find使用 . 启动当前元素.

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

现在你的输出只有
Key2

关于xml - Xpath 不适用于 XML::Twig::XPath::Elt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47310146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com