XML命名空间的这种用法是否正确?

时间:2012-03-30 13:35:33

标签: xml validation namespaces xsd prefix

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

我的不确定性是关于&lt; x&gt;。和&lt; y&gt;元素。是o.k.他们是不合格的?

[更新] XML实例是否会针对给定的Schema进行验证?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这取决于你想要什么。 如果我对你的XML执行以下Xpath:

//*[namespace-uri()='http://example.org/math/types/' and local-name()='x']

不会返回任何元素。

如果我按如下方式更改XML: -

<m:x>3.14159265358979</m:x>

将返回该元素。

如果你想让X和Y不合格,像这样的X路会将它们挖出来: -

//*[namespace-uri()='http://example.org/math/types/' and local-name()='Add']/x