根元素
<schema>元素是每一个XML Schema的根元素
例:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/SimpleXmlSchema"
xmlns:tns="http://www.example.org/SimpleXmlSchema"
elementFormDefault="qualified">
</xs:schema>
①第一行行表明schema中用到的元素和数据类型所来自的命名空间,同时表明来自该空间要加前缀xs:
②第二行显示被此schema定义的元素所在的命名空间
③第三行指出默认的命名空间
④第四行指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定
简易元素
仅包含文本的元素,不包含任何其他的元素或属性
语法:<xs:element name=" " type= " "/>
默认值:default = " "
固定值:fixed = " "
Tips:在定义简易元素时,数据类型可通过别名进行定义
<xs:element name=“simple” type=“myType”>
<xs:simpleType name=“myType”>
</xs:simpleType>
有关XSD限定(Facets,对文本范围内容进行约束)
①整型取值范围(0~100)
<xs:simpleType name="numberType">
<xs:restriction base="xs:integer">
<!-- 取值范围 -->
<xs:minInclusive value="0"/>
<xs:maxInclusive value="100"/>
</xs:restriction>
</xs:simpleType>
②模式匹配(取值为ABC、DEF中的某一个)
<xs:simpleType name="valueIN">
<xs:restriction base="xs:string">
<!-- 枚举匹配 -->
<xs:enumeration value="ABC"></xs:enumeration>
<xs:enumeration value="DEF"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
③模式约束(小写字母或空格,最大长度15,类似于正则表达式)
<xs:simpleType name="model">
<xs:restriction base="xs:string">
<!-- 模式匹配及最大长度 -->
<xs:pattern value="([a-z ])*"></xs:pattern>
<xs:maxLength value="15"></xs:maxLength>
</xs:restriction>
</xs:simpleType>
属性
语法<xs:attribute name=“xxx” type=“yyy”/>
①属性的默认值和固定值 同简易元素
②可选和必选
缺省情况下,属性可选,使用use="required"规定为必选
复合元素
包含其他元素或属性的元素
此处比较重要的是simpleContent和complexContent区别:
1)、simpleContent
①extension(base可为内置类型、simpleType引用)
可以为元素添加属性,也可直接为空,不添加属性,但无法使用Facets进行约束
②restriction(base属性必须是复杂类型数据引用)
可以使用Facets进行约束
2)、complexContent
①extension
配合指示器,在base基础上进行扩展
②restriction
修饰element或attribute,只能添加属性
实例
①复合空元素(只含属性)
<!-- 复合空元素(仅含属性) -->
<xs:complexType name="compEmpt">
<xs:attribute name="field" type="xs:integer"></xs:attribute>
</xs:complexType>
也可使用complexContent
②复合类型(只含元素)
<!-- 复合类型(仅含元素) -->
<xs:complexType name="compEle">
<xs:sequence>
<xs:element name="EleOne" type="xs:boolean"></xs:element>
<xs:element name="EleTwo" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
③仅含文本(可添加属性)
<!-- 仅含文本 -->
<xs:complexType name="onlyText">
<xs:simpleContent>
<xs:extension base="xs:integer">
<!-- 添加use标签使得属性必选 -->
<xs:attribute name="locate" type="xs:string" use="required"></xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
④混合内容(可同时包括元素、文本、属性)
<xs:complexType name="fixContest" mixed="true">
<xs:sequence>
<xs:element name="fixOne" type="xs:string"></xs:element>
<xs:element name="fixTwo" type="xs:string"></xs:element>
</xs:sequence>
<xs:attribute name="att" type="xs:string"></xs:attribute>
</xs:complexType>
⑤对已有复杂类型进行扩展
<xs:element name="Comp">
<xs:complexType>
<xs:complexContent>
<xs:extension base="复杂类型">
<xs:sequence>
······
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
复合类型指示器
1)、Order指示器(用于定义元素的顺序)
①ALL指示器
规定子元素按照任意顺序出现,每个子元素必须只出现一次
PS:可把minOccurs设为0或1,maxOccurs只能设为1
②Choice指示器
规定可出现某个子元素或可出现另外一个子元素(非此即彼)
③Sequence指示器
规定子元素必须按照特定的顺序出现
2)、Occurrence指示器(用于定义某个元素出现的频率)
PS:对于所有的“Order”和“Group”指示器,其中maxOccurs和minOccurs的默认值均为
①maxOccurs指示器
规定某个元素可出现的最大次数
如:
\<xs:sequence>
\<xs:element name="full_name" type="xs:string"/>
\<xs:element name="child_name" type="xs:string" maxOccurs="10"/>
\</xs:sequence>
②minOccurs指示器
规定某个元素可出现的最小次数
Tips:若需使某个元素出现次数不受限制,使用maxOccurs=“unbounded”
3)、Group指示器
用于定义相关的数批元素
①元素组
<xs:group name=“组名称”>
…
</xs:group>
必须在 group 声明内部定义一个 all、choice 或者 sequence 元素
group 定义完毕以后,就可以在另一个定义中引用它了
<!-- 元素组 -->
<xs:group name="groupEle">
<xs:sequence>
<xs:element name="groupOne" type="xs:negativeInteger"></xs:element>
<xs:element name="groupTwo" type="xs:nonNegativeInteger"></xs:element>
</xs:sequence>
</xs:group>
<!-- 经过测试发现all指示器貌似无法用于元素组-->
<xs:complexType name="groupTest">
<xs:choice>
<xs:group ref="tns:groupEle"></xs:group>
<xs:element name="groupMain" type="xs:nonPositiveInteger"></xs:element>
</xs:choice>
</xs:complexType>
②属性组
<xs:attributeGroup name=“组名称”>
…
</xs:attributeGroup>
<!-- 属性组 -->
<xs:attributeGroup name="attGroup">
<xs:attribute name="oneAttr" type="xs:string"></xs:attribute>
<xs:attribute name="twoAttr" type="xs:normalizedString" default="shhh hhh"></xs:attribute>
</xs:attributeGroup>
<xs:complexType name="attGroupTest">
<xs:sequence>
<xs:element name="ele" type="xs:string"></xs:element>
</xs:sequence>
<xs:attributeGroup ref="tns:attGroup"></xs:attributeGroup>
<xs:attribute name="mainAttr" type="xs:token"></xs:attribute>
</xs:complexType>
元素替换(Element Substitution)
1)、元素替换(substitutionGroup属性)
先声明主元素,再声明次元素
<!-- 元素替换 -->
<xs:element name="aElement" type="xs:string"></xs:element>
<xs:element name="bElement" substitutionGroup="tns:aElement"></xs:element>
<xs:element name="mainEle">
<xs:complexType>
<xs:sequence>
<xs:element ref="tns:aElement"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="secEle" substitutionGroup="tns:mainEle"></xs:element>
即数据可以为:
<mainEle> <aElement> abc <aElement> <mainEle>
或<secEle> <bElement> abc <bElement> <secEle>
或<secEle> <aElement> abc <aElement> <secEle>
或<mainEle> <bElement> abc <bElement> <mainEle>
PS:可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,就不必规定可替换元素的类型了。substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素。
Tips:全局元素: “schema” 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
2)、阻止元素替换
使用block属性
例:
<xs:element name=“aElement” type=“xs:string” block=“substitution”></xs:element>
<any>和<anyAttribute>元素
1)、<any> 元素
使得可以通过未被 schema 规定的元素来拓展 XML 文档
例:
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
可以编写一个Schema文档定义扩展元素,让一个XML文档遵守两个Schema
在头部指定:
xsi:SchemaLocation=“namespace1 filename1.xsd namespace2 filename2.xsd”>
2)、<anyAttribute> 元素
使得可以通过未被 schema 规定的属性来拓展 XML 文档!
例:
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
可以编写一个Schema文档定义扩展元素,让一个XML文档遵守两个Schema
PS:<any> 和 <anyAttribute> 均可用于制作可扩展的文档!
它们使文档有能力包含未在主 XML schema 中声明过的附加元素。