1、什么是XML约束
@H_502_0@在XML技术中,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
@H_502_0@2、XML语法和XML约束的区别
@H_502_0@作用 | 制定者 | |
---|---|---|
XML语法 | 规范XML文件的基本编写规则 | 由w3c组织制定的 |
XML约束 | 规范XML文件数据内容格式的编写规则 | 由开发者自行定义 |
3、常用的XML约束技术
@H_502_0@DTD约束:语法相对简单,功能也相对简单。学习成本也低。
Schema约束:语法相对复杂,功能也相对强大。学习成本相对高!!!(名称空间)
@H_502_0@4、XML约束DTD
@H_502_0@DTD(Document Type Definition):文档类型定义
@H_502_0@4.1、DTD与XML文件关联的三种方式
@H_502_0@三种方式:内部DTD、引用本地DTD和引用公共DTD
@H_502_0@4.1.1、内部DTD
@H_502_0@语法:
<!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
@H_502_0@语法:
<!DOCTYPE根元素SYSTEM"文件名">
实例:
文件note.dtd
<!ELEMENTnote(to,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
@H_502_0@语法:
<!DOCTYPE根元素PUBLIC"DTD名称""DTD文件的URL">
实例:
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
4.2、DTD语法
@H_502_0@4.2.1、元素
@H_502_0@元素声明使用下面的语法:
<!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、属性
@H_502_0@语法:
<!ATTLIST元素名称属性名称属性类型默认值>
或
<!ATTLIST元素名称 属性名称属性类型默认值 属性名称属性类型默认值 ... >
默认值:
#IMPLIED 属性不是必需的
CDATA :表示普通字符串
(en1|en2|..): 表示一定是任选其中的一个值,枚举值
ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头
4.2.3、实体
@H_502_0@实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
在DTD定义中,通过定义一个实体,在 XML文件中就可以引用这个实体了。
语法:
<!ENTITY实体名称"实体的值">
实例:
<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEPersons[ <!ENTITYauthor"张三"> <!ENTITYhome"中国北京"> ]> <Persons> &author;住在&home; </Persons>
展示:
注释: 一个实体由三部分构成: 一个和号 (&),一个实体名称,以及一个分号 (;)。
@H_502_0@5、Schema
@H_502_0@XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
5.1、XML Schema与DTD
@H_502_0@XML Schema符合XML语法结构,本身就是XML文档
DTD文档的结构是平铺性,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系, Schema相对文档结构较强
XML Schema比DTD支持更多的数据类型,并支持用户自定义数据类型
XML Schema定义约束的能力更强大
XML Schema 对命名空间进行支持
5.2、XML Schema快速入门
@H_502_0@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>