XPath 表示具有默认命名空间且未定义前缀的 XML



我有一个根元素,其中包含以下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:xs="...",就无法处理它以下网站确实处理了它,并给了我我的期望。http://www.xpathtester.com/xpath

哪个是正确的实现?

短名称是指命名空间前缀

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

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

理想情况下,当 XPath 的宿主上下文已知时,应正确声明和使用命名空间前缀,而不是通过 local-name() 进行躲避。

函数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'] 

最新更新