XML Schema快速入门(一)

目录

 

XML Schema的作用是什么?

要不要学XML Schema技术?

XML Schema难不难学?

 XML Schema文档快速书写(语法我们将会在例子中介绍)

1 首先我们也需要对XML Schema文档进行声明(版本声明、编码声明、独立声明)

2 书写根元素

3 在根元素内引入命名空间声明(重点)

4 声明元素

1 我们想限定一个值

 2 我们想限定一组值

3 我们想限定一系列值


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 定义空白字符(换行、回车、空格以及制表符)的处理方式。

怎么样,是不是很爽。

其他知识点我们将在(二)中介绍。

猜你喜欢

转载自blog.csdn.net/qq_41708275/article/details/84667654