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

XPath for XML with default namespace and no prefix defined?

我有一个具有以下 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="...",Notepad++ 将不会处理它 以下网站确实处理了它并给了我我所期望的。 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']