XML之Schema
schema与dtd一样,用于验证xml的有效性。
schema的文档结构:
定义book.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/book" elementFormDefault="qualified"> </xs:schema>
根元素都是schema
xmlns:xs:用于构造schema的元素和数据类型来自http://www.w3.org/2001/XMLSchema命名空间
targetNamespace:用于定义我们自己的schema的元素和数据类型来自http://www.example.org/book命名空间
xml的结构
<?xml version="1.0" encoding="gbk"?>
<根元素 xmlns="uri" xmlns:xi="http://www.w3.org/2001/XMLSchema-instance" xi:schemaLocation="uri xsd文件.xsd"> <子元素></子元素> </根元素>
xmlns声明来源的名称空间,uri找xsd中targetNamespace取值
schemaLocation从哪里来的,声明一个标准的名称空间
xsd语法:
1.简单元素 xs:element
<xs:element name="color" type="xs:string"/>
默认值使用default,固定值:fixed
<color>red</color>
2.定义属性 xs:attribute
<xs:attribute name="lang" type="xs:string"/>
默认值使用default="",固定值:fixed="",可选与必须使用use="required"
<color lang="hong">red</color>
其中元素与属性常用类型:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
3.限定 xs:restriction
对值的限定。xs:minInclusive ,xs:maxInclusive限定age的值在0-120
<xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> </xs:restriction> </xs:simpleType> </xs:element>
对一组值的限定。xs:enumeration限定car的名只能为audi,golf.bmw
<xs:element name="car"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="Audi"/> <xs:enumeration value="Golf"/> <xs:enumeration value="BMW"/> </xs:restriction> </xs:simpleType> </xs:element>
对一些列的值的限定。xs:pattern。限定letter的值只能是a-z的其中一个i
<xs:element name="letter"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-z]"/> </xs:restriction> </xs:simpleType> </xs:element>
对空白字符的限定。xs:whiteSpace 。限定address的值如果有空白不会移除preserve。replace移除。collapse移除
<xs:element name="address"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> </xs:restriction> </xs:simpleType> </xs:element>
对长度的限定。xs:length 。限定密码长度必须是8位
<xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="8"/> </xs:restriction> </xs:simpleType> </xs:element>
xs:minLength最小值,xs:maxLength最大值
<xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="5"/> <xs:maxLength value="8"/> </xs:restriction> </xs:simpleType> </xs:element>
4.复合元素 xs:complexType
就是包含元素和属性的元素
- 空元素 xs:complexContent 元素给出的信号是,我们打算限定或者拓展某个复合类型的内容模型
<product prodid="1345" />
<xs:element name="product"> <xs:complexType> <xs:complexContent> <xs:restriction base="xs:integer"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:restriction> </xs:complexContent> </xs:complexType> </xs:element>
也可以用
<xs:element name="product"> <xs:complexType> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType> </xs:element>
或者使用,type 属性表示,这个属性的作用是引用要使用的复合类型的名称
<xs:element name="product" type="prodtype"/> <xs:complexType name="prodtype"> <xs:attribute name="prodid" type="xs:positiveInteger"/> </xs:complexType>
- 包含其他元素的元素 xs:sequence表示元素必须按次序出现
<person> <firstname>John</firstname> <lastname>Smith</lastname> </person>
可以使用:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
可以使用:
<xs:element name="person" type="persontype"/> <xs:complexType name="persontype"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType>
- 仅包含文本的元素 xs:simpleContent
<shoesize country="france">35</shoesize>
使用extension 或 restriction 元素来扩展或限制元素的基本简易类型
<xs:element name="shoesize"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
也可以使用:
<xs:element name="shoesize" type="shoetype"/> <xs:complexType name="shoetype"> <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name="country" type="xs:string" /> </xs:extension> </xs:simpleContent> </xs:complexType>
- 包含元素和文本的元素
<letter> Dear Mr.<name>John Smith</name>. Your order <orderid>1032</orderid> will be shipped on <shipdate>2001-07-13</shipdate>. </letter>
使用: mixed="true"
<xs:element name="letter"> <xs:complexType mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType> </xs:element>
也可以使用:
<xs:element name="letter" type="lettertype"/> <xs:complexType name="lettertype" mixed="true"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderid" type="xs:positiveInteger"/> <xs:element name="shipdate" type="xs:date"/> </xs:sequence> </xs:complexType>
xsd指示器:
all指示器,<all> 指示器规定子元素可以按照任意顺序出现,且每个子元素必须只出现一次:
<xs:element name="person"> <xs:complexType> <xs:all> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:all> </xs:complexType> </xs:element>
choice指示器,<choice> 指示器规定可出现某个子元素或者可出现另外一个子元素(非此即彼):
<xs:element name="person"> <xs:complexType> <xs:choice> <xs:element name="employee" type="employee"/> <xs:element name="member" type="member"/> </xs:choice> </xs:complexType> </xs:element>
sequence指示器,<sequence> 规定子元素必须按照特定的顺序出现:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
maxOccurs指示器,<maxOccurs> 指示器可规定某个元素可出现的最大次数:子元素 "child_name" 可在 "person" 元素中最少出现一次(其中 minOccurs 的默认值是 1),最多出现 10 次。
xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10"/> </xs:sequence> </xs:complexType> </xs:element>
minOccurs指示器,<minOccurs> 指示器可规定某个元素能够出现的最小次数:
<xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="full_name" type="xs:string"/> <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element>
子元素 "child_name" 可在 "person" 元素中出现最少 0 次,最多出现 10 次。
group指示器,、Group 指示器用于定义相关的数批元素。
<xs:group name="persongroup"> <xs:sequence> <xs:element name="firstname" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:element name="birthday" type="xs:date"/> </xs:sequence> </xs:group> <xs:element name="person" type="personinfo"/> <xs:complexType name="personinfo"> <xs:sequence> <xs:group ref="persongroup"/> <xs:element name="country" type="xs:string"/> </xs:sequence> </xs:complexType>
在 group 声明内部定义一个 all、choice 或者 sequence 元素。
attributeGroup指示器,
<xs:attributeGroup name="personattrgroup"> <xs:attribute name="firstname" type="xs:string"/> <xs:attribute name="lastname" type="xs:string"/> <xs:attribute name="birthday" type="xs:date"/> </xs:attributeGroup> <xs:element name="person"> <xs:complexType> <xs:attributeGroup ref="personattrgroup"/> </xs:complexType> </xs:element>
参考资料:
1.http://blog.csdn.net/csh624366188/article/details/7431852
2.http://blog.sina.com.cn/s/blog_73c5cfbe0101cfbs.html