目录
XML Schema文档快速书写(语法我们将会在例子中介绍)
1 首先我们也需要对XML Schema文档进行声明(版本声明、编码声明、独立声明)
XML Schema的作用是什么?
Schema:架构。与DTD文档一样,是一种XML约束文档。
要不要学XML Schema技术?
当然,XML Schema很快将会取代DTD。理由如下:
- XML Schema 可针对未来的需求进行扩展
- XML Schema 更完善,功能更强大
- XML Schema 基于 XML 编写
- XML Schema 支持数据类型 //这是XML Schema最重要的能力之一。
- XML Schema 支持命名空间
XML Schema难不难学?
个人认为十分难学,比DTD复杂数倍。当然复杂的原因是因为它更加丰富,也正是因为它复杂 ,才有现在的地位。(简单来说就是一句话:不难的话,我们还不学呢!)
当然它也有友好的一面:通俗的来说,它就是一种XML文档。w3shool中XMLSchema教程中对此的描述是:
XML Schema文档快速书写(语法我们将会在例子中介绍)
XML Schema文档的后缀名为.xsd(XML Schema Define)
1 首先我们也需要对XML Schema文档进行声明(版本声明、编码声明、独立声明)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2 书写根元素<schema>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema>
...
...
</xs:schema>
3 在根元素内引入命名空间声明(重点)
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:abc="http://www.abc.org/schema"
targetNamespace="http://www.thisxml.com/schema"
xmlns="http://www.thisxml.com/schema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
...
...
</xs:schema>
对于命名空间这里就不解释了,请参考:https://www.jianshu.com/p/49d44ffc9f47,写的真是太好了,你所有的疑惑在里面都能找到答案,能够帮助你进一步理解。
4 声明元素
XML Schema中的元素可以分为简易元素、复杂元素。
简易元素:仅包含文本的元素。基本语法为:
<xs:element name="xxx" type="yyy"/>
此处 xxx 指元素的名称,yyy 指元素的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的数据类型是:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
a.如果简单元素有默认值或者固定值的话也需要声明。例如:
<xs:element name="color" type="xs:string" default="red"/>
<xs:element name="color" type="xs:string" fixed="red"/>
设置默认值后可以指定其他value,当不指定时,使用默认值;当设置固定之后,也可以指定value,但只能指定固定value,所以,你就不用指定了。
在XML文档中你可以将简单元素这样书写:
<color>pink</color>//此时color指定为pink当不指定时使用默认值red、
<color></color>//不指定时,color使用固定值
<color>red</color>//指定时,也只能使用固定值
可以看出,简单元素只包含文本,并没有属性,那如何对简单元素添加属性,使之变成复杂元素呢?
先来介绍一下如何如何属性,例如:
<xs:attribute name="xxx" type="yyy"/>
在此处,xxx 指属性名称,yyy 则规定属性的数据类型。XML Schema 拥有很多内建的数据类型。
最常用的类型是:
- xs:string
- xs:decimal
- xs:integer
- xs:boolean
- xs:date
- xs:time
当然属性也可以有默认值以及固定值
<xs:attribute name="lang" type="xs:string" default="EN"/>
<xs:attribute name="lang" type="xs:string" fixed="EN"/>
其实,不管属性是默认的还是固定的,其都是可选的,为了让根据他写XML文档的人必须使用它,我i们可以这样写:
<xs:attribute name="lang" type="xs:string" use="required"/>
我们说,XML Schema文档相比于DTD文档最大的优点就是可以具体限制某个元素的,我们将他叫做元素限定(Facets)
下面我们介绍限定:
1 我们想限定一个值
/*
限定类型为xs:integer的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>
2 我们想限定一组值
/*
限定类型为xs:string的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>
3 我们想限定一系列值
/*
限定类型为xs:string的letter的值为小写字母a-z中的一个
*/
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
我们将这种限定称为模式约束(pattern constraint)。
我们也可以这么写
<xs:pattern value="[A-Z][A-Z][A-Z]"/>//可接受的值是大写字母 A - Z 其中的三个
<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>//接受的值是大写或小写字母 a - z 其中的三个
<xs:pattern value="[xyz]"/>//可接受的值是字母 x, y 或 z 中的一个
<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>//可接受的值是五个阿拉伯数字,每个数字的范围是
0-9
<xs:pattern value="([a-z])*"/>//可接受的值是 a - z 中零个或多个字母
<xs:pattern value="([a-z][A-Z])+"/>//可接受的值是一对或多对字母,每对字母由一个小写字母后跟一个大写字母组成。举个例子,"sToP"将会通过这种模式的验证,但是 "Stop"、"STOP" 或者 "stop" 无法通过验证
<xs:pattern value="male|female"/>//可接受的值是 male 或者 female
<xs:pattern value="[a-zA-Z0-9]{8}"/>//可接受的值是由 8 个字符组成的一行字符,这些字符必须是大写或小写字母 a - z 亦或数字 0 - 9
<xs:whiteSpace value="preserve"/>//这个 whiteSpace 限定被设置为 "preserve",这意味着 XML 处理器不会移除任何空白字符
<xs:whiteSpace value="replace"/>//这个 whiteSpace 限定被设置为 "replace",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符)
<xs:whiteSpace value="collapse"/>//这个 whiteSpace 限定被设置为 "collapse",这意味着 XML 处理器将移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
<xs:length value="8"/>//<xs:length value="8"/>//其值必须精确到 8 个字符
<xs:minLength value="5"/>//其值最小为 5 个字符,最大为 8 个字符
<xs:maxLength value="8"/>
可以看出,对元素进行限定时,要先说明将要限定的元素是一个简单类型还是复杂元素。然后将限定语句包围在 </xs:restriction>标签内。
书写限定语句时,要先说明限定哪方面,然后通过value=“”进行限定。
如果要想对限定进行复用,我们可以给他起一个名字,例如
<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>
这样,其他元素也可以用这个名字叫carType的限定。
限定的方向有:
限定 描述 enumeration 定义可接受值的一个列表 fractionDigits 定义所允许的最大的小数位数。必须大于等于0。 length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。 maxExclusive 定义数值的上限。所允许的值必须小于此值。 maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。 maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。 minExclusive 定义数值的下限。所允许的值必需大于此值。 minInclusive 定义数值的下限。所允许的值必需大于或等于此值。 minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。 pattern 定义可接受的字符的精确序列。 totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。 whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。
怎么样,是不是很爽。
其他知识点我们将在(二)中介绍。