这是参考XML。
<abc:respone xmlns:abc="abc.def.org" operation="POST-create-endpoint">
<link type="application/xml" href="http://www.xyz.org" rel="related" />
<messages>
<abc:message type="ERROR" code="123">
<value>this is error code</value>
</abc:message>
</messages>
</abc:respone>
必须获取&#39;价值&#39;这是&#39;这是错误代码&#39;。如果没有“错误”类型的错误。或者没有标记&#39;值&#39;,然后必须返回空白。我是xpath语言的新手,请帮助。
答案 0 :(得分:1)
您可以选择string(/abc:respone/messages/abc:message[@type = 'ERROR']/value)
。请注意,您需要某种方式来声明绑定到abc
前缀的名称空间,如何执行此操作取决于您使用的XPath API。
答案 1 :(得分:0)
要在拥有名称空间时使用元素名称,您需要通过将前缀映射到它们并在XPath表达式中使用该前缀来注册名称空间,如@MartinHonnen的答案中所述。这是依赖于实现的,因此除非您告诉我们您使用什么语言来运行XPath,否则无法告诉您如何操作。
但是,与您使用的语言无关,您可以通过不使用元素名称作为选择器来忽略名称空间。并不总是建议这样做,因为当您在不同的命名空间中具有相同名称的元素时,它可能会导致冲突。但是,为了从您正在使用的文档中提取值,它可能是一种解决方案。使用通配符(例如*
,node()
等)选择所有元素,然后使用测试本地名称的谓词来限制结果集。在您的情况下,您可以使用此表达式:
/*[local-name()='respone']
/*[local-name()='messages']
/*[local-name()='message'][@type = 'ERROR']
/*[local-name()='value']
/text()
(在使用之前检查本地名称是否正确 - 它真的是respone
还是response
?)