关于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表达式来验证这两种情况。请帮忙。
答案 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。然后,命名空间的差异将本地化到代码中的一个位置,并且不会渗透到整个应用程序中。