Schema与DTD一样,都是对xml文件的规范和约束,但是Schema比DTD更加细粒度、数据类型更多、功能更加强大,所以现在大多数都选择Schema。Schema也是一个XML文件,因此编写Schema也需要按照xml的规范进行编写,因此我们会思考那么schema是有什么来规范和验证的呢?其实Schema也是有DTD进行规范和验证的。
Schema按照xml文件的规范,所以需要添加:<?xml version="1.0" encoding="utf-8" standalone="yes"?>。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace=“”>......</xs:schema>使用命名空间:xmlns:xs ="..." 其中命名空间的地址是固定不变的。
targetNamespace表示将当前的元素或类型或属性放到指定的空间中(有全局和局部之分,通过elementFormDefault和attributeFormDefault来指定),如果指定了targetNamespace的值,就需要通过使用xmlns定义命名空间指向该空间,如果不指定targetNamespace的值,则表示缺省,那么在使用元素或者类型或者属性时就不需要加上命名空间前缀,
此时elementFormDefault和attributeFormDefault将不起作用。
elementFormDeafult和attributeFormDefault有 unqualified和qualified两个选择值,当elementFormDefault取值qualified时,表示此时的全局元素或者属性将被定义的指定的命名空间中,在此文件中使用时需要加上命名前缀,并且全局元素的子元素将被以缺省方式放到目标命名空间,当elementFormDefault取值unqualified时,表示全局的置于命名空间中,在此文件中使用时仍需要加上命名前缀,而局部的置于无名空间中,这些特性也就决定的我们在生成xml文件实例是否需要在子元素前面加上命名前缀,当取值qualified表示在父元素和子元素上都需要加上前缀,当取值unqualified是表示不需要再子元素前面加上前缀。
在这里我们还需要注意一点就是在局部的元素中如果我们使用form属性时,form取值qualified和unqualified,当前的限定范围就会覆盖指定的范围,例如elementFormDefault取值qualified,form取值unqualified时,那么当前的就会定义在无名空间中,即在xml实例中该子元素时,就不需要加上前缀。
attributeFormDefault与elementFormDefault类似。
一、定义元素
<xs:element name=" " type=" "/>
二、定义属性
<xs:attribute name=" " type=" "/>
三、简单类型simpleType,对属性或者元素的约束,简单类型中不能包含属性或者元素,只是简单的文本
<xs:simpleType name="">
<xs:restriction base=""> //表示约束,base 表示基于哪一种类型(xs:int/xs:string.........),在<xs:restriction>元
</xs:restriction>//素下表示对长度、大小、枚举等限制
</xs:simpleType>
例如:<xs:simpleType name="type">
<xs:restriction base="xs:string">
<xs:length value="2"/>
</xs:restriction>
</xs:simpleType> //表示type为长度为2的字符串
在simpleType中除了除了restriction之外还可以取list、union
<xs:simpleType>
<xs:list itemType="xs:int"/>//指定该类是int类型的列表,在xml实例中取值通过空格隔开
</xs:simpleType>
xs:simpleType>
<xs:union memberTypes="xs:int xs:string" > //表示该类型是int和string的联合体
</xs:union>
</xs:simpleType>
四、复合类型complexType,也是对属性或者元素的约定,complexType包含元素或者属性或者二者都包含。
<xs:complexType name="">
<xs:sequence>//表示序列,该序列下面的元素必须按照给定的顺序出现,通过属性maxOccurs="" minOccurs=""
<xs:element name=" " type=" "/> //指定总体出现的最大次数和最小次数,默认值为1
<xs:element name=" " type=" "/> maxOccurs="unbounded"表示无上限
</xs:sequence>
<xs:attribute name="" type=""/>//指定属性
</xs:complexType>
除了使用sequence之外还可以使用all 、group 、choice
<xs:all>.....</xs:all>表示其下面的元素整体按照任意的顺序出现,可出现一次或者零次
<xs:group>....</xs:group>表示按照组的形式出现
<xs:choce>....</xs:choice>表示每次选择其下的一个元素,maxOccurs="" minOccurs=""选择的最大、最小次数
另外complexType 下面还可以使用simpleContent和complexContent,其中simpleContent表示该复合类型没有元素,包含文本,还可以包含属性。
<xs:complexType name="">
<xs:simpleContent>
<xs:extension base="xs:int">//在这里还可以使用restriction
<xs:attribute name="name" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>//表示包含属性name和文本为int类型的符合类型
五、group和attributeGroup
group表示对元素进行分组,attributeGroup表示对属性进行分组,在其它地方可以通过ref属性对其进行
六、unique 表示在一定的范围内对属性或者元素的唯一性进行限定
例如:<xs:element name="books">
<xs:complexType>
<xs:sequence>
<xs:element name="bookName" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="bookUnique">
<xs:selector xpath="bookName"></xs:selector>//表示指定范围
<xs:field xpath="."></xs:field>//表示当前元素本身在指定的范围内唯一
</xs:unique>
</xs:element>
--------------------------------------------------------------------------------------------------------
<xs:element name="books">
<xs:complexType>
<xs:sequence>
<xs:element name="book" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
<xs:attribute name="id" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="bookUnique">
<xs:selector xpath="book"/> //指定范围
<xs:field xpath="id"/>//指定id属性在指定的范围内唯一
</xs:unique>
</xs:element>
7、 key元素 用于对元素或者属性的唯一性进行限定
另外还有一个refkey元素,它与key元素一起使用
<xs:keyref refer="sortKey" name="sortKeyRef"> //refer表示引用一个key元素
<xs:selector xpath="book"></xs:selector>//表示限定的范围
<xs:field xpath="type"></xs:field>//表示type的值必须是sortKey中的一员
</xs:keyref>
----------------------------------------------------------------------------------------------------------------------------------------------------------
<xs:element name="学生名册" type="students"/> <xs:complexType name="students"> <xs:sequence minOccurs="1" maxOccurs="unbounded"> <xs:element ref="student"/> </xs:sequence> </xs:complexType> <xs:element name="student" type="s"/> <xs:complexType name="s"> <xs:sequence minOccurs="1" maxOccurs="1"> <xs:element ref="name"/> <xs:element ref="gender"/> <xs:element ref="age"/> </xs:sequence> <xs:attribute name="id" type="xs:int" use="required"/> </xs:complexType> <xs:element name="name" type="xs:string"/> <xs:element name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="男"/> <xs:enumeration value="女"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:int"> <xs:minExclusive value="0"/> <xs:maxInclusive value="150"/> </xs:restriction> </xs:simpleType> </xs:element>
原文链接:https://www.f2er.com/xml/297304.html