Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 对具有不同名称空间元素的单个根元素进行Xpath验证_Xml_Xpath_Xpath 2.0 - Fatal编程技术网

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

Xml 对具有不同名称空间元素的单个根元素进行Xpath验证,xml,xpath,xpath-2.0,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="y

关于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即可。即使是空前缀(即使用默认名称空间声明)也意味着相同

例如,假设我在中声明了一个绑定到正确名称空间uri的前缀
foo
,如*:

foo="http://xml.mycompany.com/XMLSchema"
以下XPath将在任一场景中返回1个元素:

//foo:Consumers
*)请注意,声明用于XPath的前缀因平台而异。这是特定于xpathtester的


为了演示,我将这两个场景放在一个
元素中,XPath返回两个
消费者
元素(运行演示)

示例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 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"/>

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

例如,假设我在中声明了一个绑定到正确名称空间uri的前缀
foo
,如*:

foo="http://xml.mycompany.com/XMLSchema"
以下XPath将在任一场景中返回1个元素:

//foo:Consumers
*)请注意,声明用于XPath的前缀因平台而异。这是特定于xpathtester的


为了演示,我将这两个场景放在一个
元素中,XPath返回两个
消费者
元素(运行演示)

示例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 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。名称空间中的差异随后被本地化到代码中的一个地方,并且不会渗透到整个应用程序中。

如果您必须编写处理两个相同(或基本相同)的XML变体(除了名称空间URI)的代码,我的一般建议是从规范名称空间URI开始,即,对文档进行转换,以便它们都使用相同的名称空间URI。名称空间中的差异随后被本地化到代码中的一个地方,并且不会渗透到整个应用程序中。

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

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

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

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

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

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

元素存在时,“验证”是什么意思?是的。我正在为上面提到的两种场景寻找一个通用的验证。验证元素是否存在是什么意思?是的。我正在寻找上述两种场景的通用验证。