我希望您在以下方面提供帮助:
给定 .xml 文件:
<network>
<netelement>
<node pwd="KOR-ASBG" func="describe_SBG_TGC">
<collection category="IMT" dir="Stream_statistics"></collection>
</node>
</netelement>
<netelement>
<node pwd="ADR-ASBG" func="describe_SBG_TGC">
<collection category="IMT" dir="Stream_statistics"></collection>
<collection category="IMT" dir="Proxy_registrar_statistics_ACCESS"></collection>
</node>
</netelement></network>
我想做的是获取属性为“KOR-ASBG”的元素,例如, 但仅使用 XPath。
我编写了以下 Perl 代码:
#!/usr/bin/perl -w
use strict ;
use warnings ;
use XML::LibXML ;
use Data::Dump qw(dump) ;
my $dump = "/some_path/_NETELEMENT_.xml" ;
my $parser = new XML::LibXML ; my $doc ;
eval{ $doc = $parser->parse_file($dump) ; } ;
if( !$doc ) { print "failed to parse $dump" ; next ; }
my $root = $doc->getDocumentElement ;
my $_demo = $root->find('/network/netelement/node[@pwd="KOR-ASBG"]') ;
print dump($_demo)."\n" ;
但是,它显示的是:
bless([bless(do{\(my $o = 155172440)}, "XML::LibXML::Element")], "XML::LibXML::NodeList")
所以问题是,如何使用 XPath 获取包含“pwd”属性(等于“KOR-ASBG”)的 XML 元素?
谢谢你:)
附言。我也试过:
my @_demo = $root->findnodes('/network/netelement/node[@pwd="KOR-ASBG"]') ;
print dump(@_demo)."\n" ;
它显示的是:
bless(do{\(my $o = 179552448)}, "XML::LibXML::Element")
最佳答案
技术上可能有多个元素匹配,这就是返回结果集而不是单个节点的原因。你可以使用
my ($ele) = $root->findnodes('/network/netelement/node[@pwd="KOR-ASBG"]');
这会将第一个匹配项放入 $ele。
关于perl、libxml、xpath : how to get an element through an attribute in this example . xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651201/