知识源自于世界,我只是一个传递者;你帮我走过的路,我正在帮他走下去。
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或自行搜索。