一、Schema文件的部分元素及属性说明:
1、targetNamespace
可以使用targetNamespace 属性将默认命名空间中的元素和属性放入不同的命名空间。还可以指定在显示局部声明的架构元素和属性时,是否应由命名空间限定(使用前缀显式限定或默认隐式限定)。
2、elementFormDefault(同样的还有attributeFormDefault)
MSDN中elementFormDefault 属性的解释:
在该架构的目标命名空间中声明的元素的形式。该值必须是下列字符串之一:qualified 或 unqualified。默认值为 unqualified。
如果该值是 unqualified,则无须通过命名空间前缀限定目标命名空间的元素。
如果该值是 qualified,则必须通过命名空间前缀限定目标命名空间的元素。
具体的可以参考下面的贴子:
http://www.xml.org.cn/dispbbs.asp?BoardID=23&id=25672&replyID=17053&star=1&skin=0
3、import
将其他的Schema文件包含进来。其中,schemaLocation要素指明文件相对路径,namespace要素指明目标命名空间。
二、编码建议示例:
Xsd_1.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.temp.com/XSD_1"
xmlns:xsd1="http://www.temp.com/XSD_1"
xmlns:xsd2="http://www.temp.com/XSD_2"
elementFormDefault="qualified">
<xs:import
namespace="http://www.temp.com/XSD_2"
schemaLocation="xsd_2.xsd" />
<xs:element name="child">
<xs:complexType>
<xs:sequence>
<xs:element ref="xsd1:child" />
<xs:element ref="xsd1:Field" />
<xs:element ref="xsd1:Value" />
<xs:element ref="xsd2:Field" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Field">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Beautal" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Value">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="JD 000000" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
Xsd_2.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.temp.com/XSD_2"
xmlns="http://www.temp.com/XSD_2"
elementFormDefault="qualified">
<xs:element name="Field">
<xs:complexType>
<xs:sequence>
<xs:element ref="Value" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Value">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="CU 0101757" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
三、总结
在Schema文件编写中,建议使用目标命名空间,即targetNamespace 。如:在xsd_2.xsd中,可以在“xs:schema”节点中这样写:
targetNamespace="http://www.temp.com/XSD_2"
之后在xsd_1.xsd文件中引用xsd_2.xsd文件的时候,可以这样写:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.temp.com/XSD_1"
xmlns:xsd1="http://www.temp.com/XSD_1"
xmlns:xsd2="http://www.temp.com/XSD_2"
elementFormDefault="qualified">
<xs:import namespace="http://www.temp.com/XSD_2" schemaLocation="xsd_2.xsd" />
……
</xs:schema>
其中,xmlns:xsd2="http://www.temp.com/XSD_2"表示引用xsd_2.xsd中的命名空间,同时需要注意的是必须使用<xs:import />标签将xsd_2.xsd文件导入。
另外,为了方便的使用所有的命名空间,建议为每个引用的命名空间赋给一个唯一的前缀,如上xmlns:xsd2="http://www.temp.com/XSD_2"的“xsd2”, xmlns:xsd1="http://www.temp.com/XSD_1"中的“xsd1”。这样,在引用其中的元素的时候可以这样调用:
……
<xs:element ref="xsd1:child" />
<xs:element ref="xsd1:Field" />
<xs:element ref="xsd1:Value" />
<xs:element ref="xsd2:Field" />
……
由于使用了命名空间,建议将elementFormDefault设为"qualified",原因参考元素介绍。
附件为两个xsd文件