知识源自于世界,我只是一个传递者;你帮我走过的路,我正在帮他走下去。
W3School有标准教程,网址:http://www.w3school.com.cn/schema/index.asp
下面,是本人的一些整理:
1.0、XML Schema(xsd) 是什么?
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
实在不懂官方定义,可想成: xsd是交通法,xml是行人。
xsd(交通法)规定了红停绿行,xml(行人)需遵守xsd(交通法)的规定。
基本可以替代DTD。想要了解DTD,点击:http://www.w3school.com.cn/dtd/dtd_intro.asp
2.0、为什么要使用 XML Schema(xsd)?
你也可以不用,然后你会发现要么编译不过,要么编译过了,运行出错。
多数情况下的作用是一种校验。
例:
甲、乙公司交互,约定格式传参格式为 <password>password</password>。
甲方传<pwd>pwd</pwd>,如果没有xsd,等到交互时才发现失败。
如果有xsd,在编写程序时,就告诉你<pwd>pwd</pwd>是错的,不符合xsd规定。
3.0、如何使用 XML Schema(xsd)?
3.1、<schema> 元素
<schema> 元素是每一个 XML Schema 的根元素,可包含属性。
例1:
<?xml version="1.0"?>
<xs:schema>
...
</xs:schema>
例2:
<?xml version="1.0"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
...
</xs:schema>
例1: 定义一个根元素。
例2: 定义一个根元素,并做出相关定义。以下对各片段解释:
xmlns:xs="http://www.w3.org/2001/XMLSchema
显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema"。
同时它还规定了来自命名空间 "http://www.w3.org/2001/XMLSchema" 的元素和数据类型应该使用前缀 xs
targetNamespace="http://www.w3school.com.cn"
显示被此 schema 定义的元素来自命名空间: "http://www.w3school.com.cn"。
xmlns="http://www.w3school.com.cn"
指出默认的命名空间是 "http://www.w3school.com.cn"。
elementFormDefault="qualified"
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
3.2、xsd元素-(简易元素)
xxx-元素名称,yyy-元素类型。
<xs:element name="xxx" type="yyy"/>
<xs:element name="color" type="xs:string" default="red"/> --无值时,默认值为red
<xs:element name="color" type="xs:string" fixed="red"/> --固定值为red,无法设置其他值。
仅包含文本的元素,文本有很多类型。常用类型:
xs:string
xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
例:
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="date" type="xs:date"/>
3.3、xsd属性(简易类型)
xxx-属性名称,yyy属性类型
<xs:attribute name="xxx" type="yyy"/>
<xs:attribute name="lang" type="xs:string" default="EN"/> --default,无值时,默认为EN
<xs:attribute name="lang" type="xs:string" fixed="EN"/> --fixed,固定值为EN,无法设置他值
<xs:attribute name="lang" type="xs:string" use="required"/> --use,默认为可选,如要必选,可用
例:
带有属性的元素,
<xs:attribute name="lang" type="xs:string"/>
3.4、xsd限定
为 XML 元素或者属性定义可接受的值。对 XML 元素的限定被称为 facet。一般有如下情况:
a)、对值的限定
定义了带有一个限定且名为 "age" 的元素。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>
b)、对一组值的限定
定义了带有一个限定的名为 "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:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
c)、对一系列值的限定
把 XML 元素的内容限制定义为一系列可使用的数字或字母,我们要使用模式约束(pattern constraint)
定义了带有一个限定的名为 "letter" 的元素。此处类似于正则表达式,可以参考正则表达式,这里不举例。
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z][A-Z][a-zA-Z][xyz]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
定义了带有一个限定的名为 "prodid" 的元素。可接受的值是五个阿拉伯数字的一个序列,且每个数字的范围是 0-9:
<xs:element name="prodid">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
定义了带有一个限定的名为 "gender" 的元素。可接受的值是 male 或者 female:
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
d)、对空白字符的限定
对空白字符(whitespace characters)的处理方式,我们需要使用 whiteSpace 限定。
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<!--
1、preserve, 不会移除任何空白字符
2、replace,移除所有空白字符(换行、回车、空格以及制表符)
3、collapse,将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,
开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
-->
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
e)、对长度的限定
如需限制元素中值的长度,我们需要使用 length、maxLength 以及 minLength 限定。
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<!--
<xs:minLength value="5"/> --最小为 5 个字符
<xs:maxLength value="8"/> --最大为 8 个字符
-->
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
f)、数据类型的限定
限定 描述
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。
3.5、复合元素
包含其他元素及/或属性的 XML 元素。
a、空元素
声明的元素,不能包含内容,只能含有属性
<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>
或写成:
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
b、仅含元素
声明的元素只能包含其他元素。
<xs:element name="person">
<xs:complexType>
<!-- xs:sequence——意味着被定义的元素必须按上面的次序出现在 "person" 元素中 -->
<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>
c、仅含文本
声明的元素可包含文本和属性,向此内容添加 simpleContent 元素。
用 extension 或 restriction 元素来扩展或限制元素的基本简易类型。
声明了一个复合类型,其内容被定义为整数值,并且 "shoesize" 元素含有名为 "country" 的属性:
<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>
d、包含混合内容
声明的元素包含属性、元素以及文本。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>
3.6、xsd指示器
a)、Order 指示器:
(1)、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>
(2)、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>
(3)、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>
b)、Occurrence 指示器:
maxOccurs 、minOccurs
可规定某个元素可出现的最大次数。
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<!-- unbounded--无上限 -->
<xs:element name="p_name" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="c_name" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>
c)、Group 指示器:
(1)、元素组,必须在 group 声明内部定义一个 all、choice 或者 sequence 元素
<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>
(2)、属性组
<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>
3.7、xsd <any> 、xsd <anyAttribute>
一般在多个xsd之间引用对方时候,可以扩展用到。具体可以参考W3School。
注:源自于网络,仅供参考,其他部分拓展如元素替换、数据类型等可以参考W3School或自行搜索。
来源:oschina
链接:https://my.oschina.net/u/2557435/blog/547256