1、什么是XML约束


在XML技术中,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

2、XML语法和XML约束的区别


XML语法和XML约束的区别
作用制定者XML语法规范XML文件的基本编写规则由w3c组织制定的XML约束规范XML文件数据内容格式的编写规则由开发者自行定义


3、常用的XML约束技术


DTD约束:语法相对简单,功能也相对简单。学习成本也低。

Schema约束:语法相对复杂,功能也相对强大。学习成本相对高!!!(名称空间)

4、XML约束DTD


DTD(Document Type Definition):文档类型定义

4.1、DTD与XML文件关联的三种方式


三种方式:内部DTD、引用本地DTD和引用公共DTD

4.1.1、内部DTD


语法:

<!DOCTYPE根元素[元素声明]>

实例:

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEnote[<!ELEMENTnote(to,from,heading,body)><!ELEMENTto(#PCDATA)><!ELEMENTfrom(#PCDATA)><!ELEMENTheading(#PCDATA)><!ELEMENTbody(#PCDATA)>]><note><to>美国</to><from>中国</from><heading>Hello</heading><body>主体</body></note>




4.1.2、引用本地DTD


语法:

<!DOCTYPE根元素SYSTEM"文件名">

实例:

文件note.dtd

<!ELEMENTnote(to,from,heading,body)><!ELEMENTto(#PCDATA)><!ELEMENTfrom(#PCDATA)><!ELEMENTheading(#PCDATA)><!ELEMENTbody(#PCDATA)>

文件note.xml

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEnoteSYSTEM"note.dtd"><note><to>美国</to><from>中国</from><heading>Hello</heading><body>主体</body></note>




4.1.3、引用公共DTD


语法:

<!DOCTYPE根元素PUBLIC"DTD名称""DTD文件的URL">

实例:

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">



4.2、DTD语法



4.2.1、元素


元素声明使用下面的语法:

<!ELEMENT元素名称类别>

或者

<!ELEMENT元素名称(元素内容)>

类别:


元素的类别类型类型值作用空标签EMPTY表示元素一定是空元素普通字符串(#PCDATA)表示元素的内容一定是普通字符串(不能含有子标签)任何内容ANY表示元素的内容可以是任意内容(包括子标签)

(元素内容)

顺序问题:<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> 按顺序出现子标签

次数问题:

元素出现的次数标签含义语法示例(空)必须且只出现1次<!ELEMENT 元素名称 (子元素名称)><!ELEMENT note (message)>+至少出现1次<!ELEMENT 元素名称 (子元素名称+)><!ELEMENT note (message+)>*0或n次<!ELEMENT 元素名称 (子元素名称*)><!ELEMENT note (message*)>?0 或1次<!ELEMENT 元素名称 (子元素名称?)><!ELEMENT note (message?)>



4.2.2、属性


语法:

<!ATTLIST元素名称属性名称属性类型默认值>

<!ATTLIST元素名称属性名称属性类型默认值属性名称属性类型默认值...>


默认值:

#REQUIRED 属性值是必需的

#IMPLIED 属性不是必需的

#FIXED value 属性不是必须的,但属性值是固定的

属性类型:控制属性值的

CDATA :表示普通字符串

(en1|en2|..): 表示一定是任选其中的一个值,枚举值

ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头



4.2.3、实体


实体是用于定义引用普通文本或特殊字符的快捷方式的变量。

在DTD定义中,通过定义一个实体,在XML文件中就可以引用这个实体了。

语法:

<!ENTITY实体名称"实体的值">

实例:

<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEPersons[<!ENTITYauthor"张三"><!ENTITYhome"中国北京">]><Persons>&author;住在&home;</Persons>

展示:

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

5、Schema


XML Schema 是基于 XML 的 DTD 替代者。

XML Schema 描述 XML 文档的结构。

XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。


5.1、XML Schema与DTD


XML Schema符合XML语法结构,本身就是XML文档

DTD文档的结构是平铺性,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系,Schema相对文档结构较强

XML Schema比DTD支持更多的数据类型,并支持用户自定义数据类型

XML Schema定义约束的能力更强大

XML Schema 对命名空间进行支持


5.2、XML Schema快速入门


Schema本身就是一个XML文档,但扩展名为.xsd。

一个Schema文档通常称之为约束文档,遵循这个约束书写的XML文件称之为实例文档。

和XML文件一样,一个Schema文档必须有一个根节点,并且这个根节点的名称必须为schema。

编写一个Schema文档后,通常需要把这个文件中声明元素绑定到一个URI上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可能通过这个URI(即名称空间)来告诉解析引擎,XML文档中编写的元素来自哪里,被谁约束。

5.3、实例


books.xsd(XML Schema文件)

<?xmlversion="1.0"encoding="UTF-8"?><schemaxmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.rk.com/books"elementFormDefault="qualified"><!--targetNamespace表示当前XMLSchema文档中声明的元素定义在http://www.rk.com/books命名空间中--><!--elementFormDefault="qualified"表示在此schema中声明过的元素必须被命名空间限定--><elementname="books"><!--name属性表示当前元素的“标签名”--><complexType><!--复杂元素,由complexType进行定义--><sequence><!--子元素序列--><elementname="book"maxOccurs="unbounded"><complexType><sequence><elementname="title"type="string"/><!--简单元素,由type属性进行定义--><elementname="price"type="double"/><any></any><!--后面可以任意写--></sequence><!--属性的声明一般写到sequence的后面--><attributename="id"type="ID"use="required"/></complexType></element></sequence></complexType></element></schema>


books.xml(XML实例文件)

<?xmlversion="1.0"encoding="UTF-8"?><rk:booksxmlns:rk="http://www.rk.com/books"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.rk.com/booksbooks.xsd"><!--xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"是固定写法,实例命名空间--><!--xsi:schemaLocation此属性就有两个值:第一值是需要使用的命名空间;第二个值是该命名空间使用的XMLSchema的位置--><rk:bookid="b1"><rk:title>往事并不如烟</rk:title><rk:price>49.9</rk:price></rk:book><rk:bookid="b02"><rk:title>XML学习</rk:title><rk:price>23.2</rk:price></rk:book></rk:books>

booksWithDefaultNameSpace.xml(XML实例文件)

<?xmlversion="1.0"encoding="UTF-8"?><booksxmlns="http://www.rk.com/books"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.rk.com/booksbooks.xsd"><!--使用默认命名空间格式:xmlns="http://www.rk.com/books"--><!--一个XML实例文档只允许有一个默认命名空间--><bookid="b1"><title>最后的贵族</title><price>49.9</price></book></books>