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

时间:2016-02-25 01:31:08

标签: xml xpath xpath-2.0

关于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表达式来验证这两种情况。请帮忙。

3 个答案:

答案 0 :(得分:2)

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

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

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

以下XPath将在任一场景中返回1个元素:

//foo:Consumers

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

为了演示,我将两个场景放在<root>元素中,XPath返回两个Consumers元素(运行demo 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"/>

答案 1 :(得分:1)

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

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

这避免了在XPath实现中注册任何名称空间前缀的需要。 这个XPath也可以在XPath 1.0中使用。

答案 2 :(得分:0)

我的一般建议是,如果必须编写处理两个相同(或大致相同)的XML变体的代码,除了命名空间URI之外,首先要规范化命名空间URI,即对文档进行转换,以便它们都使用相同的名称空间URI。然后,命名空间的差异将本地化到代码中的一个位置,并且不会渗透到整个应用程序中。