XML 命名空间的这种用法是不是正确?
Posted
技术标签:
【中文标题】XML 命名空间的这种用法是不是正确?【英文标题】:Is this usage of XML Namespaces correct?XML 命名空间的这种用法是否正确? 【发布时间】:2012-03-30 13:35:32 【问题描述】:我在http://msdn.microsoft.com/en-us/library/ms996486.aspx 上发现了这篇关于 WSDL 的非常有用的文章,正如某处另一篇文章中关于 SO 所推荐的那样。
不过,我想知道,如果这个例子没有错误。
这是(简化的)架构:
<xs:schema
targetNamespace="http://example.org/math/types/"
xmlns="http://example.org/math/types/"
>
<xs:complexType name="MathInput">
<xs:sequence>
<xs:element name="x" type="xs:double"/>
<xs:element name="y" type="xs:double"/>
</xs:sequence>
</xs:complexType>
<xs:element name="Add" type="MathInput"/>
</xs:schema>
这是实例(包含在 SOAP 中):
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
>
<SOAP-ENV:Body>
<m:Add xmlns:m="http://example.org/math/types/">
<x>3.14159265358979</x>
<y>3.14159265358979</y>
</m:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我的不确定性在于
[更新] XML 实例是否会根据给定的 Schema 进行验证?
【问题讨论】:
【参考方案1】:这是一种非传统的 XML 设计,我不太喜欢它,但它完全有效。架构未指定 elementFormDefault="Qualified",因此本地元素 x 和 y 不在命名空间中。
【讨论】:
+1 完全正确。 “unqualified”表示目标命名空间中的元素不需要使用命名空间前缀进行限定。【参考方案2】:这取决于你想要什么。 如果我对您的 XML 执行以下 Xpath:
//*[namespace-uri()='http://example.org/math/types/' and local-name()='x']
不会返回任何元素。
如果我按如下方式更改您的 XML:-
<m:x>3.14159265358979</m:x>
元素将被返回。
如果你想让 X 和 Y 不合格,像这样的 Xpath 将把它们挖出来:-
//*[namespace-uri()='http://example.org/math/types/' and local-name()='Add']/x
【讨论】:
不错的答案!我喜欢你用来解释发生了什么的非常实际的例子。这样我就可以同时刷新我的 X-Path 技能 :-)。该示例不是我自己的,所以我只是想知道他们是否犯了错误并忘记限定 x 和 y,或者是否有一些宽容的 xml 验证模式不介意您忘记添加前缀.. . 我想我可以更具体地问一下:XML 实例会根据给定的 Schema 进行验证吗? 是的,对于您指定的架构,XML 将根据该架构进行验证。我使用名为 OxygenXml 的工具对其进行了检查。如果您正在进行 XSD 验证,我强烈建议您下载它。以上是关于XML 命名空间的这种用法是不是正确?的主要内容,如果未能解决你的问题,请参考以下文章
具有显式默认命名空间的 XML 文档的 XPath 和命名空间规范