获取含特定子节点值的节点的命名空间无关XPath表达式求助
获取包含特定子节点值的命名空间无关XPath表达式
没问题,我来帮你搞定这个命名空间无关的XPath表达式!先把你提供的XML片段贴出来方便参考:
<?xml version="1.0" encoding="UTF-8"?> <FWWO xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <FWWOSet> <WORKORDER> <COORDINATES> <Point> <KEY>123456</KEY> <LAT>32.97740936279297</LAT> <LONG>-81.84439086914062</LONG> </Point> <Point> <!-- 其他Point节点内容 --> </Point> </COORDINATES> </WORKORDER> </FWWOSet> </FWWO>
因为你的XML带有默认命名空间xmlns="http://www.ibm.com/maximo",普通的XPath(比如//Point)会找不到节点——所有元素都属于这个命名空间,不指定前缀或忽略命名空间的话无法匹配。要写命名空间无关的XPath,我们可以用local-name()函数匹配节点的本地名称,完全忽略命名空间的影响。
常用的几种表达式示例:
如果你要直接找到包含
<KEY>123456</KEY>的<Point>节点,最简洁的写法是://*[local-name()='Point' and *[local-name()='KEY']='123456']这个表达式的逻辑是:查找任意层级下,本地名称为
Point,且存在一个本地名称为KEY的子节点、其文本值等于123456的节点。如果你想从上层节点开始精准定位(比如从
WORKORDER往下找),可以写://*[local-name()='WORKORDER']/*[local-name()='COORDINATES']/*[local-name()='Point' and *[local-name()='KEY']='123456']还有一种反向定位的写法(效果和第一个一致),通过KEY节点找到它的父Point节点:
//*[local-name()='KEY' and text()='123456']/parent::*[local-name()='Point']
额外说明:
local-name()的兼容性非常好,几乎所有支持XPath的工具(比如浏览器开发者工具、Python的lxml库、Java的XPathAPI等)都支持,适合绝大多数场景。- 如果你的XPath引擎支持XPath 2.0及以上,也可以用
namespace-uri()做更复杂的匹配,但local-name()是忽略命名空间最通用的方案。
内容的提问来源于stack exchange,提问作者PLynn
相关产品推荐
相关产品推荐

