文章目录
- 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>
解释如下
- !DOCTYPE note (第二行): 定义此文档是note类型的文档
- !ELEMENT note: 定义note元素有四个元素: "to, from, heading, body”
- !ELEMENT to: 定义to元素为"#PCDATA"类型
- !ELEMENT from: 定义from 元素为"#PCDATA"类型
- !ELEMENT heading素为"#PCDATA"类型
- !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 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
元素格式
- 空元素 <!ELEMENT element-name EMPTY>
- 可以为任何内容 <!ELEMENT element-name ANY>
- 最少出现一次的元素 <!ELEMENT element-name (child-name+)>
- 出现零次或多次的元素 <!ELEMENT element-name (child-name*)>
- 出现零次或一次的元素<!ELEMENT element-name (child-name?)>
- 声明"非…/即…"类型的内容<!ELEMENT element-name (child-name1 | child-name2 | …)>
- 声明混合型的内容<!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>
解释如下:
- xmlns:xs=“http://www.w3.org/2001/XMLSchema”
此片段显示schema中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema”中. 同时它还规定了来自命名空间"http://……." 的元素和数据类型应该使用前缀xs:, 相当于命名空间的别名 - targetNamespace="http://www.runoob.com”
此片段显示被此schema定义的元素(note to from heading body) 来自命名空间:"http:www.runoob.com”. - 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>
解释如下:
- xmlns=“http://www.runoob.com”
规定了默认命名空间的声明, 此声明会告知schema验证器, 在此XML文档中使用的所有元素都被声明于"http://www.runoob.com”这个命名空间 - 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>