perl 使用XML::LibXML获取XML元素

jxct1oxe  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(203)

我需要根据 type 元素以不同的方式处理xml文件。我使用findnodes($xpath,$contextNode)方法来查找属于一个结构的元素。元素可以有<type>A</type><type>B</type>两种类型。当我处理类型为B的节点时,有没有办法“跳转”到类型为A的元素以获得ID值?
基本上,我需要能够找出id为2,类型为B的元素与id为1,类型为A的元素在相同的结构中。

<structure>
    <element>
        <def>
            <id>1</id>
            <type>A</type>
        </def>
    </element>
    <element>
        <def>
            <id>2</id>
            <type>B</type>
        </def>
    </element>
</structure>
hgncfbus

hgncfbus1#

您可以使用parent轴。

my ( $elementB ) = $xpc->findnodes(
   "parent::*/element[ def/type='B' ]",
   $elementA,
);

[1]第一次世界大战
XPath提供了方便的..快捷方式。

my ( $elementB ) = $xpc->findnodes(
   "../element[ def/type='B' ]",
   $elementA,
);

[1]第一次世界大战
或者,您可以使用preceding-siblingfollowing-sibling轴的组合。

my ( $elementB ) = $xpc->findnodes(
   " preceding-sibling::*[ def/type='B' ]
   | following-sibling::*[ def/type='B' ]
   ",
   $elementA,
);

[1]第一次世界大战
在XPath之外,$node->parentNode将获得父节点。由于OP提到了findnodes,并且因为它更简洁,所以这个答案集中在XPath上。
1.我认为这支持XPath 2,而libxml2(由XML::LibXML使用)只支持XPath 1,但是这些路径应该对两者都有效。

相关问题