如何编写XPath表达式从带属性的XML节点中提取字符串
你写的第一个XPath表达式//*[local-name() = 'Response']本身已经可以正确匹配到XML中的<Response>元素节点,没有返回预期结果的核心原因是你没有指定要提取该节点的哪部分内容。第二个表达式@*//*[local-name() = 'Response']逻辑存在错误:@*代表匹配所有属性节点,后续的//是从属性节点向下查找子元素,不可能找到对应的<Response>节点。
根据常见的提取需求,对应正确写法如下:
提取
<Response>节点的ResponseCode属性值(即示例中的Ok):
简化版(忽略命名空间校验)://*[local-name() = 'Response']/@ResponseCode
严谨版(避免不同命名空间下同名节点干扰)://*[local-name() = 'Response' and namespace-uri() = 'http://www.nrf-arts.org/IXRetail/namespace/']/@ResponseCode提取
<Response>节点下<RequestID>的文本内容(即示例中的1):
简化版://*[local-name() = 'Response']/*[local-name() = 'RequestID']/text()
严谨版://*[local-name() = 'Response' and namespace-uri() = 'http://www.nrf-arts.org/IXRetail/namespace/']/*[local-name() = 'RequestID' and namespace-uri() = 'http://www.nrf-arts.org/IXRetail/namespace/']/text()
如果你的XPath执行工具支持预先注册命名空间,更推荐注册默认命名空间后直接写带前缀的表达式,相比local-name()写法可读性和准确性都更高。
内容的提问来源于stack exchange,提问作者Adithya Sridharan

