文章目录

  • XML验证
  • DTD约束
  • 内部的 DOCTYPE 声明
  • 外部文档声明
  • PCDATA数据格式
  • CDATA数据格式
  • 元素格式
  • 属性约束格式
  • XML Schema约束
  • 简介
  • 什么是XML Schema
  • XML Schema 是 DTD的继任者
  • XML Schema使用XML语法编写, 本身就是XML
  • 如何使用
  • XSD-元素
  • XSD-简易属性
  • xsd-对值的限定
  • 数据类型得限定表格
  • 复合元素


XML验证

有正确的XML被称为"形式良好"的XML

DTD约束

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD可声明在XML文档中, 也可通过外部引入

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
	<to>Tove</to>
	<from>Jani</from>
	<heading>Reminder</heading>
	<body>"Don't forget me this weekend"</body>
</note>

解释如下

  1. !DOCTYPE note (第二行): 定义此文档是note类型的文档
  2. !ELEMENT note: 定义note元素有四个元素: "to, from, heading, body”
  3. !ELEMENT to: 定义to元素为"#PCDATA"类型
  4. !ELEMENT from: 定义from 元素为"#PCDATA"类型
  5. !ELEMENT heading素为"#PCDATA"类型
  6. !ELEMENT body: 定义from 元素为"#PCDATA"类型
外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
	<to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Dot't forget me this weekend!</body>
</note>

这是包含DTD的note.dtd文件

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
PCDATA数据格式

PCDATA 的意思是被解析的字符数据( parsed character data).

可把字符数据想象为XML元素的开始标签与结束标签之间的文本 PCDATA 是会被解析器解析的文本, 这些文本将被解析器检查实体以及标记. 文本中的标签会被当做标记来处理, 而实体会被展开. 不过, 被解析的字符数据不应该包含任何&, < 或 >等字符. 需要用实体来表示.

CDATA数据格式

CDATA 的意思是字符数据(character data)。

**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

元素格式
  1. 空元素 <!ELEMENT element-name EMPTY>
  2. 可以为任何内容 <!ELEMENT element-name ANY>
  3. 最少出现一次的元素 <!ELEMENT element-name (child-name+)>
  4. 出现零次或多次的元素 <!ELEMENT element-name (child-name*)>
  5. 出现零次或一次的元素<!ELEMENT element-name (child-name?)>
  6. 声明"非…/即…"类型的内容<!ELEMENT element-name (child-name1 | child-name2 | …)>
  7. 声明混合型的内容<!ELEMENT element-name (#PCDATA | to | from | heading)*>
属性约束格式

属性通过ATTLIST 声明来进行声明

DTD属性声明用如下格式

<!ATTLIST element-name attribute-name attribute-type attribute-value>

<!ATTLIST payment type CDATA "check">
<!--实例如下-->
<payment type="check"/>

属性类型:

类型

描述

CDATA

值为字符数据 (character data)

(en1|en2|…)

此值是枚举列表中的一个值

ID

值为唯一的 id

IDREF

值为另外一个元素的 id

IDREFS

值为其他 id 的列表

NMTOKEN

值为合法的 XML 名称

NMTOKENS

值为合法的 XML 名称的列表

ENTITY

值是一个实体

ENTITIES

值是一个实体列表

NOTATION

此值是符号的名称

xml:

值是一个预定义的 XML 值

默认属性值可以使用下列值


解释


属性的默认值

#REQUIRED

属性值是必需的

#IMPLIED

属性不是必需的

#FIXED value

属性值是固定的

列举属性值

<!ATTLIST element-name attribute-name (en1|en2|..) default-value>

XML Schema约束

简介
  • XML Schema是基于XML的DTD代替者
  • XML Schema是可描述XML文档的结构
  • XML Schem语言也可作为XSD(XML Schema Definition) 来引用
什么是XML Schema

XML Schema 的作用是定义XML文档的合法构建模块, 类似DTD

XML Schema:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的顺序
  • 定义子元素的数目
  • 定义元素是否为空, 或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值
XML Schema 是 DTD的继任者
  • XML Schema可针对未来的需求进行扩展
  • XML Schema 更完善, 功能更强大
  • XML Schema 基于XML编写
  • XML Schema支持数据类型
  • XML Schema支持命名空间
XML Schema使用XML语法编写, 本身就是XML
  • 不必学习新的语言
  • 可使用XML编辑器来编写Schema文件
  • 可使用XML解析器来解析Schema文件
  • 可使用XML DOM来处理Schema文件
  • 可通过XSLT来转换Schema文件
如何使用

一个简单的XML文档

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

下面这个例子是一个名为"note.xsd”的XML Schema文件, 它定义了上面哪个note.xml文档的元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

将此note.xml文档包含xml Schema的约束, 使用如下

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.w3schools.com"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3schools.com note.xsd">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>
XSD-元素

schema元素是每一个xml Schema的根元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema>
...
...
</xs:schema>

元素一般都包含属性. 一个schema声明往往是这样的

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.runoob.com"
	xmlns="http://www.runoob.com"
	elementFormDefault="qualified">
>
...
...
</xs:schema>

解释如下:

  1. xmlns:xs=“http://www.w3.org/2001/XMLSchema
    此片段显示schema中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema”中. 同时它还规定了来自命名空间"http://……." 的元素和数据类型应该使用前缀xs:, 相当于命名空间的别名
  2. targetNamespace="http://www.runoob.com
    此片段显示被此schema定义的元素(note to from heading body) 来自命名空间:"http:www.runoob.com”.
  3. elementFormDefault=“qualified”
    指出任何xml实例所使用的且在此schema中声明过的元素必须被命名空间限定

在XML文档中引用Schema文档是这样的

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.runoob.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.runoob.com note.xsd">

<to>Tove</to>
<form>Jani</form>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

解释如下:

  1. xmlns=“http://www.runoob.com
    规定了默认命名空间的声明, 此声明会告知schema验证器, 在此XML文档中使用的所有元素都被声明于"http://www.runoob.com”这个命名空间
  2. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”一旦声明了此命名空间, 就可以使用schemaLocation属性了, 此属性有两个值, 第一个值是需要的命名空间, 第二个值是供命名空间使用的xml schema的位置
XSD-简易属性

简易属性指那些只包含文本的元素. 它不会包含任何其他的元素或属性.

定义简易元素:

<xs:element name=“xxx” type=“yyy” />

xxx: 指元素的名称, yyy指元素的数据类型, XML Schema拥有很多内建的数据类型

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

例如:

<lastname>Refsnes</lastname>
<age>36</age>
<databorn>1970-03-27</databorn>

xsd定义如下

<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

简易元素的默认值和固定值

缺省值定义

<xs:element name="color" type="xs:string" default="red"/>

固定值是不能被更改的

<xs:element name="color" type="xs:string" fixed="red"/>
xsd-对值的限定

限定(restriction) 用于为xml元素或者属性定义可接受的值, 对xml元素的限定被称为 facet

限定age元素, 0<age<120

<xs:element name="age">
	<xs:sipleType>
    	<xs:restriction base="xs=integer">
        	<xs:minInclusive value="0"/>
            <xs:maxInclusive value="120"/>
        </xs:restriction>
    </xs:sipleType>
</xs:element>

对一组值的限定

如果把XML元素的内容限制为一组可接受的值, 我们使用枚举约束.

下面例子定义了一个带有限定的名为"Car”的元素, 可接受的值只有"Audi Golf BWM”

<xs:element name="car">
	<xs:simplyType>
    	<xs:restriction base="xs:string">
        	<xs:enumeration value="Audi"/>
            <xs:enumeration value="Golf"/>
            <xs:enumeration value="BWM"/>
        </xs:restriction>
    </xs:simplyType>
</xs:element>

也可以写成这样

<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
	<xs:restriction base="xs:string">
    	<xs:enumeration value="Audi"/>
        <xs:enumeration value="Gold"/>
        <xs:enumeration value="BWM" />
    </xs:restriction>
</xs:simpleType>

这种写法中, 类型"carType"也可以被其他元素使用, 因为它不是car元素的组成部分

对一系列值得限定

我们可以使用模式约束对xml元素得内容进行一系列得限定

限定"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中可填放正则表达式

对空白字符得限定

下面例子, 定义了一个带有限定得名为"address”得元素. 这个whiteSpace 限定设置为"preserve", 这意味着XML处理器不会移除任何一个空白字符

<xs:element name="address">
	<xs:simpyType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="preserve"/>
        </xs:restriction>
    </xs:simpyType>
</xs:element>

限定"address"元素移除所有空格:

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction  base="xs:string">
        	<xs:whiteSpace value="replace"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

限定元素"address"将所有得空格只保留一个空格, 类似HTML

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="cellaase"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

对长度得限定:

使用length, maxLength, minLength来限定一个元素中值得长度

限定名为"password"得元素, 长度必须精确到8位

<xs:element name="password">
	<xs:simpeType>
    	<xs:restriction base="xs:string">
        	<xs:length value="8"/>
        </xs:restriction>
    </xs:simpeType>
</xs:element>
数据类型得限定表格

限定

描述

enumeration

定义可接受值的一个列表

fractionDigits

定义所允许的最大的小数位数。必须大于等于0。

length

定义所允许的字符或者列表项目的精确数目。必须大于或等于0。

maxExclusive

定义数值的上限。所允许的值必须小于此值。

maxInclusive

定义数值的上限。所允许的值必须小于或等于此值。

maxLength

定义所允许的字符或者列表项目的最大数目。必须大于或等于0。

minExclusive

定义数值的下限。所允许的值必需大于此值。

minInclusive

定义数值的下限。所允许的值必需大于或等于此值。

minLength

定义所允许的字符或者列表项目的最小数目。必须大于或等于0。

pattern

定义可接受的字符的精确序列。

totalDigits

定义所允许的阿拉伯数字的精确位数。必须大于0。

whiteSpace

定义空白字符(换行、回车、空格以及制表符)的处理方式。

复合元素

复合元素指包含其他元素及/或属性得XML元素

四种类型得复合元素

  • 空元素
  • 包含其他元素得元素
  • 仅包含文本得元素
  • 包含元素和文本得元素

如何定义复合元素

<employee>
	<firstname>John</firstname>
    <lastname>Smith</lastname>
</employee>

现在我们用xsd来定义此元素

sequence 意味着此元素必须包含指定得顺序

<xs:element name="employee">
	<xs:complexTyep>
    	<xs:sequence>
        	<xs:element name="firstname" type="xs:string"/>
            <xs:element name="lastname" type="xs:string" />
        </xs:sequence>
    </xs:complexTyep>
</xs:element>

以上也可以这样写

<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
	<xs:sequence>
    	<xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>