perl、libxml、xpath : how to get an element through an attribute in this example . xml 文件

标签 perl xpath libxml2

我希望您在以下方面提供帮助:

给定 .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/

相关文章:

sql-server - SQL Server XML.value 上下文节点

java 。 XML。如何根据 XSD 架构验证 xml 文档的某些部分?

xml - 如何在不将重复空格替换为单个空格的情况下修剪 XSLT 中的空格?

php - 从 PHP 执行 shell 命令

regex - Perl 中的递归正则表达式

file - 在 Perl 中,如何避免多次打开文件

xml - 使用 Perl 模块时的最佳实践

ruby - RVM 不适用于 1.9.1 但适用于 1.8.6 和 1.8.7

perl - Perl Encode.pm无法解码具有宽字符的字符串

c - perl 和 C 脚本的管道