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 和命名空间规范

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

读取带命名空间的Xml文档的方法备忘

C++ 中命名空间的 5 个常见用法

C# using的用法

如何在 C++ 中正确使用命名空间?