Xpath获取Namespace的值

时间:2014-07-07 17:44:04

标签: xml xpath

这是参考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语言的新手,请帮助。

2 个答案:

答案 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?)