我需要根据类型元素以不同的方式处理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-sibling
和following-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,因为它更简洁、更简单。
- 我认为这支持XPath 2,而libxml2 (XML::LibXML使用)只支持XPath 1,但这些路径应该对两者都有效。