perl、libxml、xpath:如何通过本示例中的属性获取元素

perl、libxml、xpath:如何通过本示例中的属性获取元素,perl,xpath,libxml2,Perl,Xpath,Libxml2,我希望您在以下方面给予帮助: 给定.xml文件: <network> <netelement> <node pwd="KOR-ASBG" func="describe_SBG_TGC"> <collection category="IMT" dir="Stream_statistics"></collection>

我希望您在以下方面给予帮助:

给定.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>
但是,它被揭示的是:

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。

您的转储程序对象没有欺骗您;您将获得一个节点列表。要访问它,您可以对其进行迭代,也可以只访问第一个节点:

print $_demo->get_node(0)->toString()
当然,一旦获得实际节点,所有DOM方法都可用:

print $_demo->get_node(0)->getAttribute('func');

您看到的是他们在Perl中所称的“不透明对象”。它不是散列,而是包中一组词汇散列的键,其中包含所有实例的字段。这是Perl实现具有安全性的对象的方法。获取他们信息的唯一方法是致电他们的获取访问者

了解如何处理这些问题的方法是注意
bless
的第二个参数,并查找以下内容:

http://search.cpan.org/perldoc?

或者在您的情况下:和

现在,我不建议在所有情况下都这样做,但是如果您注意到,NodeList对象是一个幸运的数组引用。因此,您可以访问最后一个节点,如下所示:

my $nodes      = $root->find('/network/netelement/node[@pwd="KOR-ASBG"]');
my $first_node = $nodes->[0];
my $last_node  = $nodes->[-1];

当然,让列表实现像数组一样运行通常是有意义的,可以通过受祝福的数组或重载运算符,也可以通过
tie
s。所以,在这种情况下,我不认为这是一个太大的违反封装

谢谢ikegami的关注。输出如下:bless([bless(do{(my$o=178343592)},“XML::LibXML::Element”),“XML::LibXML::NodeList”)*我事先知道它在结果集中不能超过一个元素。@user690182,那么我相信你错抄了我发布的内容。(您是否忘记了
$ele
)请重试。您应该得到
bless(do{\(my$o=999999)},“XML::LibXML::Element”)
thanx!它起作用了!但我需要另一条建议:如何获取最后一个子元素(例如,最后一个“collection”元素)?print$\u demo->get\u node(0)->lastChild->textContent,似乎不起作用:(打开另一个问题,我很乐意尝试一下。因此,告诉他查看文档,然后继续执行一些没有文档记录的操作。将nodelist视为对节点数组的引用是不安全的。
my $nodes      = $root->find('/network/netelement/node[@pwd="KOR-ASBG"]');
my $first_node = $nodes->[0];
my $last_node  = $nodes->[-1];