使用XML::LibXML获取XML元素



我需要根据类型元素以不同的方式处理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>

可以使用parent

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

Demo on xpather.com[1]


XPath提供方便的..快捷方式。

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

Demo on xpather.com[1]


或者,您可以使用preceding-siblingfollowing-sibling轴的组合。

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

Demo on xpather.com[1]


在XPath之外,$node->parentNode将获得父节点。因为OP提到了findnodes,所以这个回答主要关注XPath,因为它更简洁、更简单。


  1. 我认为这支持XPath 2,而libxml2 (XML::LibXML使用)只支持XPath 1,但这些路径应该对两者都有效。

最新更新