我尝试将 .XSD 文件写入下面显示的包含2个命名空间的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<ns1:Envelope
xmlns:ns1="http://www.webserviceX.NET/ConversionRate/Input" >
<ns1:Body>
<ns2:ConversionRate
xmlns:ns2="http://www.webserviceX.NET">
<ns2:FromCurrency>USD</ns2:FromCurrency>
<ns2:ToCurrency>USD</ns2:ToCurrency>
</ns2:ConversionRate>
</ns1:Body>
</ns1:Envelope>
我写了两个xml方案来定义这个xml文件
第一个( Envelope.xsd )
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="http://www.webserviceX.NET/ConversionRate/Input"
xmlns:ns2="http://www.webserviceX.NET/"
targetNamespace="http://www.webserviceX.NET/ConversionRate/Input">
<xs:import namespace="http://www.webserviceX.NET/"
schemaLocation="C:\Documents and Settings\RoGulk\Desktop\SPM\ConversionRate.xsd"/>
<xs:element name="Body">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns2:ConversionRate"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Envelope">
<xs:complexType>
<xs:sequence>
<xs:element ref="ns1:Body"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
ConversionRate.xsd(内部XSD)看起来像这样
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.webserviceX.NET/"
xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:element name="ConversionRate">
<xs:complexType>
<xs:sequence>
<xs:element name="FromCurrency" type="xs:string"/>
<xs:element name="ToCurrency" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
但问题是我无法针对这些方案定义验证上面的xml。
有没有人知道问题是什么? 感谢!!!
答案 0 :(得分:0)
您需要指定在架构文档ConversionRate.xsd中声明的本地元素位于ns2命名空间中。最简单的方法是在elementFormDefault="qualified"
元素上添加xs:schema
;另一种方法是在form="qualified"
和FromCurrency
的元素声明中指定ToCurrency
。
为什么?
一些模式作者强烈认为本地元素应该像本地属性一样,并且具有不合格的名称;其他人同样强烈地认为,在特定名称空间的模式文档中声明的所有元素都应该在该名称空间中。开发XSD 1.0的工作组痛苦地争吵了几个月(你仍然可以通过窃听“问题208!”来使旧的XSD WG成员脸色苍白),然后通过将决定交给架构作者来妥协。不合格的一方赢得了抛硬币,elementFormDefault
属性的默认值为unqualified
。这为那些希望本地元素不合格的人节省了麻烦,这意味着像您一样希望他们具备资格的人需要将elementFormDefault="qualified"
作为标准架构文档模板的一部分。