XML::LibXML findnodes 未返回任何匹配的节点

发布于 2024-12-19 03:08:15 字数 950 浏览 0 评论 0原文

我有一个没有命名空间的简单 XML。

我正在使用 XML::LibXML::Reader 来解析 XML。当我得到匹配的元素时,我就完成了搜索。据我了解,该元素的类型为 XML::LibXML::Element。 (我在继续使用 XML::LibXML::Reader 时有一定的限制)

当我尝试将 findnodes 与 xpath 一起使用时,它不起作用。 这是代码

my $libXMLPattern = XML::LibXML::Pattern->new('widget');
my $element;

my $reader = XML::LibXML::Reader->new(string => $xml);
$reader->nextElement();

while ($reader->nextPatternMatch($libXMLPattern))
{
    next if ($reader->nodeType == XML_READER_TYPE_END_ELEMENT);
    $element = $reader->copyCurrentNode(1);
        last;
}
$reader->finish();


    my $xPathExp = '//component';
    my @nodes = $element->findnodes ($xPathExp);

这是 XML

<widget name="a" type="b">
<component type="C">
    <component type="ca"/>
    <component type="cb"/>
</component>
</widget>
<window>
...
</window>

请帮助我我做错了什么?

I have a simple XML without namespace.

I am using XML::LibXML::Reader to parse the XML. When I get the matched Element, I finish the search. As I understand this element is of type XML::LibXML::Element.
(I have certain limitation to continue with XML::LibXML::Reader)

When I am trying to use findnodes with xpath, it's not working.
Here is the code

my $libXMLPattern = XML::LibXML::Pattern->new('widget');
my $element;

my $reader = XML::LibXML::Reader->new(string => $xml);
$reader->nextElement();

while ($reader->nextPatternMatch($libXMLPattern))
{
    next if ($reader->nodeType == XML_READER_TYPE_END_ELEMENT);
    $element = $reader->copyCurrentNode(1);
        last;
}
$reader->finish();


    my $xPathExp = '//component';
    my @nodes = $element->findnodes ($xPathExp);

Here is the XML

<widget name="a" type="b">
<component type="C">
    <component type="ca"/>
    <component type="cb"/>
</component>
</widget>
<window>
...
</window>

Please help me what wrong I am doing?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千笙结 2024-12-26 03:08:15
use strict;
use warnings;
use feature qw( say );

use XML::LibXML::Reader qw( XML_READER_TYPE_END_ELEMENT );

my $xml = <<'__EOI__';
<widget name="a" type="b">
  <component type="C">
    <component type="ca"/>
    <component type="cb"/>
  </component>
</widget>
__EOI__

my $libXMLPattern = XML::LibXML::Pattern->new('widget');

my $element;
my $reader = XML::LibXML::Reader->new( string => $xml );
while ($reader->nextPatternMatch($libXMLPattern)) {
   next if $reader->nodeType == XML_READER_TYPE_END_ELEMENT;
   $element = $reader->copyCurrentNode(1);
   last;
}
$reader->finish();

die if !$element;

say $_->getAttribute('type') for $element->findnodes('.//component');

输出:

C
ca
cb

关键是 //component.//component

//component

/descendant:component

Well,该元素不存在于文档中的缩写,因此没有 / 可以开始。另一方面,

.//component

是 短

./descendant:component

是 长 是

descendant:component

该路径是相对于现有节点的,因此可以对其进行处理。

下次,请提供演示该问题的最小可运行代码。

use strict;
use warnings;
use feature qw( say );

use XML::LibXML::Reader qw( XML_READER_TYPE_END_ELEMENT );

my $xml = <<'__EOI__';
<widget name="a" type="b">
  <component type="C">
    <component type="ca"/>
    <component type="cb"/>
  </component>
</widget>
__EOI__

my $libXMLPattern = XML::LibXML::Pattern->new('widget');

my $element;
my $reader = XML::LibXML::Reader->new( string => $xml );
while ($reader->nextPatternMatch($libXMLPattern)) {
   next if $reader->nodeType == XML_READER_TYPE_END_ELEMENT;
   $element = $reader->copyCurrentNode(1);
   last;
}
$reader->finish();

die if !$element;

say $_->getAttribute('type') for $element->findnodes('.//component');

Output:

C
ca
cb

The key is //component vs .//component.

//component

is short for

/descendant:component

Well, the element doesn't exist in a document, so there's no / to start from. On the other hand,

.//component

is short for

./descendant:component

which is long for

descendant:component

That path is relative to an existing node, so it can be processed.

Next time, please provided the minimal and runnable piece of code that demonstrates the problem.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文