对具有不同名称空间元素的单个根元素进行 Xpath 验证

Xpath validation on single root element with different namespaces elements

关于 xpath 的快速问题。我需要验证根元素 "Consumers" 及其名称空间声明。此 xml 可能会有所不同,具体取决于它所中介的经纪人。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/>

我需要编写单个 xpath 表达式来验证这两种情况。请帮忙。

在 XPath 中,不同的前缀并不重要,只要它指向相同的命名空间 URI。即使是空前缀,即使用默认名称空间声明也意味着相同。

例如,假设我已经在 xpathtester 中声明了一个前缀 foo 绑定到正确的命名空间 uri,就像这样 * :

foo="http://xml.mycompany.com/XMLSchema"

以下 XPath 在任一情况下都会 return 1 个元素:

//foo:Consumers

*) 请注意,在 XPath 中使用的声明前缀因平台而异。这是特定于 xpathtester


为了演示,我将两个场景放在一个 <root> 元素中,并且 XPath return 都是 Consumers 元素(运行 演示here).

示例 XML :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/>
<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/>
</root>

输出:

<ss:Consumers xmlns:ss="http://xml.mycompany.com/XMLSchema"/>

<Consumers xmlns="http://xml.mycompany.com/XMLSchema"/>

如果您必须编写处理两个 XML 变体的代码,这两个变体除了命名空间 URI 之外是相同的(或基本相同的),我的一般建议是从规范化命名空间 URI 开始,也就是说,做一个对文档进行转换,以便它们都使用相同的命名空间 URI。命名空间的差异随后会局限于代码中的一个位置,不会渗透到整个应用程序中。

您可以编写一个 XPath 表达式来检查名称空间 URI 和元素的本地名称,如下所示:

/*[local-name()='Consumers' and namespace-uri()='http://xml.mycompany.com/XMLSchema']

这避免了在您的 XPath 实现中注册任何名称空间前缀的需要。 此 XPath 也适用于 XPath 1.0。