gpt4 book ai didi

XML::LibXML、 namespace 和查找值

转载 作者:数据小太阳 更新时间:2023-10-29 01:54:50 27 4
gpt4 key购买 nike

我正在使用 XML::LibXML解析带有命名空间的 XML 文档。因此我使用 XML::LibXML::XPathContext使用 XPath //u:modelfindnodes。这会正确返回 3 个节点。

我现在想在返回的 3 XML::LibXML::Element 上使用 findvalue对象,但无法确定工作方法/xpath。作为替代方案,我迭代子节点并直接匹配 nodeName,但这并不理想:

use strict;
use warnings;

use XML::LibXML;
use XML::LibXML::XPathContext;

my $dom = XML::LibXML->load_xml( IO => \*DATA );
my $context = XML::LibXML::XPathContext->new( $dom->documentElement() );
$context->registerNs( 'u' => 'http://www.ca.com/spectrum/restful/schema/response' );

for my $node ( $context->findnodes('//u:model') ) {
#my $mh = $node->findvalue('mh');
my ($mh)
= map { $_->textContent() }
grep { $_->nodeName() eq 'mh' } $node->childNodes();

#my $attr = $node->findvalue('attribute');
my ($attr)
= map { $_->textContent() }
grep { $_->nodeName() eq 'attribute' } $node->childNodes();

print "mh = $mh, attr = $attr\n";
}

__DATA__
<root xmlns="http://www.ca.com/spectrum/restful/schema/response">
<error>EndOfResults</error>
<throttle>86</throttle>
<total-models>86</total-models>
<model-responses>
<model>
<mh>0x100540</mh>
<attribute id="0x1006e">wltvbswfc02</attribute>
</model>
<model>
<mh>0x100c80</mh>
<attribute id="0x1006e">wltvsutm1ds02</attribute>
</model>
<model>
<mh>0x100c49</mh>
<attribute id="0x1006e">wltvsdora03</attribute>
</model>
</model-responses>
</root>

输出:

mh = 0x100540, attr = wltvbswfc02
mh = 0x100c80, attr = wltvsutm1ds02
mh = 0x100c49, attr = wltvsdora03

有没有一种方法可以使用注释掉的行来查找节点而不是迭代子节点的间接方法?还是有另一种方法来解决这个问题以获得配对值?

最佳答案

你不能使用 $node->findvalue() 因为整个默认命名空间的事情。但是,您可以重用 XML::LibXML::XPathContext 对象来查找所需的值:

for my $node ( $context->findnodes('//u:model') ) {
my $mh = $context->findvalue('u:mh', $node);
my $attr = $context->findvalue('u:attribute', $node);
print "mh = $mh, attr = $attr\n";
}

关于XML::LibXML、 namespace 和查找值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25419772/

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