在没有短名称的默认命名空间上使用XPATH函数

时间:2015-04-15 22:48:04

标签: xml xpath

我有一个带有以下xmlns的根元素;

<Status xmlns="http://www.tandberg.com/XML/CUIL/2.0" product="TANDBERG Codec" version="1.0.0">

它没有xmlns的简称 - 但我需要使用xpath查询文档以获取信息。我无法编辑xml文档本身。

我使用各种解析器,有些能够处理没有短名称的xmlns,有些则不能。

下面的xpath将为我提供我需要的数据 - 问题是 - 如果xpath在上述场景中被设计破坏了吗?

//*[local-name()='Hardware']/*[local-name()='Temperature'] 

IE:如果不添加xmlns,Notepad ++将无法处理它:xs =&#34; ...&#34; 以下网站处理它并给我我期望的。 http://www.xpathtester.com/xpath

哪个是正确的实施?

2 个答案:

答案 0 :(得分:2)

短名称表示名称空间前缀

XPath本身没有将名称空间前缀绑定到名称空间的机制。您必须依赖XPath的更大上下文(XSLT或其他托管语言)来声明名称空间前缀和名称空间之间的连接。

您的local-name()方法应该适用于任何一致的XPath实现。它通常在纯XPath问题的答案中提供,否则不会说明XPath上下文或库。不幸的是,它也是由那些不理解或不必要地避开命名空间的人提供的。

理想情况下,当知道XPath的托管上下文时,应正确声明和使用名称空间前缀,而不是通过local-name()回避。

答案 1 :(得分:1)

函数local-name()位于XPath 1.0规范的4.1节中。第4节是核心函数库。其中列出的每个函数都必须包含在所有XPath实现中。如果Notepad ++不支持它,那么它是一个不符合要求的处理器。

当没有名称空间前缀时使用local-name()不应该破坏任何XPath。

但是,最好还使用namespace-uri()来匹配您打算匹配的确切节点。它非常详细,但也非常准确。

示例:

//*[local-name()='Hardware' and namespace-uri()='http://www.tandberg.com/XML/CUIL/2.0']/*[local-name()='Temperature' and namespace-uri()='http://www.tandberg.com/XML/CUIL/2.0'] 
相关问题