Mil*_*ler 5 xml perl xml-libxml
我XML::LibXML用来解析带有名称空间的XML文档。因此XML::LibXML::XPathContext,我习惯于使用findnodesXPath //u:model。这将正确返回3个节点。
我现在想findvalue在3个返回的XML::LibXML::Element对象上使用,但是无法确定有效的方法/ 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>
Run Code Online (Sandbox Code Playgroud)
:
mh = 0x100540, attr = wltvbswfc02
mh = 0x100c80, attr = wltvsutm1ds02
mh = 0x100c49, attr = wltvsdora03
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以使用注释行找到节点,而不是在子节点上进行迭代的间接方法?还是有另一种方法来解决此问题以获得配对值?
$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";
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1600 次 |
| 最近记录: |