2012-03-30 86 views
0

我在http://msdn.microsoft.com/en-us/library/ms996486.aspx的WSDL上发现了这篇非常有用的文章,正如另一篇文章中的SO推荐的那样。XML名称空间的这种用法是否正确?

但我想知道,如果在这个例子中没有错误。

这里的(简化)模式:

<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> 

我的不确定性是关于< X>和< Y>元素。它是吗?他们是不合格的?

[更新] XML实例将根据给定的模式进行验证吗?

回答

0

这取决于你想要什么。 如果我对你的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 
+0

好的答案!我喜欢你用来解释发生了什么的非常实用的例子。这样我就可以同时刷新我的X-Path技能:-)。这个例子不是我自己的,所以我只是想知道他们是否犯了一个错误,并忘记限定x和y,或者如果有一些宽容的xml验证模式,不介意你忘记添加前缀。 – Student 2012-03-30 15:16:18

+0

我想我可以更具体一些,问:XML实例是否会针对给定的Schema进行验证? – Student 2012-03-30 15:17:29

+0

对于您指定的模式,XML将根据该模式进行验证。我使用名为OxygenXml的工具对其进行了检查。如果您正在进行XSD验证,我强烈建议您下载它。 – 2012-03-30 16:57:06

2

这是一种非常规的XML设计的,我不喜欢它了,但它是完全合法的。该模式没有指定elementFormDefault =“Qualified”,因此本地元素x和y不在名称空间中。

+0

+1准确无误。 “不合格”表示来自目标名称空间的元素不需要使用名称空间前缀进行限定。 – 2012-03-30 16:58:24