1、什么是XML约束
在XML技术中,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
2、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 根元素 [元素声明]>
实例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note[ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>美国</to> <from>中国</from> <heading>Hello</heading> <body>主体</body> </note>
4.1.2、引用本地DTD
语法:
<!DOCTYPE 根元素 SYSTEM "文件名">
实例:
文件note.dtd
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
文件note.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>美国</to> <from>中国</from> <heading>Hello</heading> <body>主体</body> </note>
4.1.3、引用公共DTD
语法:
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">
实例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//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 实体名称 "实体的值">
实例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Persons[ <!ENTITY author "张三"> <!ENTITY home "中国 北京"> ]> <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文件)
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.rk.com/books" elementFormDefault="qualified"> <!-- targetNamespace 表示当前XML Schema文档中声明的元素定义在http://www.rk.com/books命名空间中 --> <!-- elementFormDefault="qualified"表示在此schema中声明过的元素必须被命名空间限定 --> <element name="books"><!-- name属性表示当前元素的“标签名” --> <complexType><!-- 复杂元素,由complexType进行定义 --> <sequence><!-- 子元素序列 --> <element name="book" maxOccurs="unbounded"> <complexType> <sequence> <element name="title" type="string"/><!-- 简单元素,由type属性进行定义 --> <element name="price" type="double"/> <any></any><!-- 后面可以任意写 --> </sequence> <!-- 属性的声明 一般写到 sequence 的后面 --> <attribute name="id" type="ID" use="required"/> </complexType> </element> </sequence> </complexType> </element> </schema>
books.xml(XML实例文件)
<?xml version="1.0" encoding="UTF-8"?> <rk:books xmlns:rk="http://www.rk.com/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.rk.com/books books.xsd "> <!-- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 是固定写法,实例命名空间 --> <!-- xsi:schemaLocation此属性就有两个值:第一值是需要使用的命名空间;第二个值是该命名空间使用的XML Schema的位置 --> <rk:book id="b1"> <rk:title>往事并不如烟</rk:title> <rk:price>49.9</rk:price> </rk:book> <rk:book id="b02"> <rk:title>XML学习</rk:title> <rk:price>23.2</rk:price> </rk:book> </rk:books>
booksWithDefaultNameSpace.xml(XML实例文件)
<?xml version="1.0" encoding="UTF-8"?> <books xmlns="http://www.rk.com/books" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.rk.com/books books.xsd "> <!-- 使用默认命名空间 格式:xmlns="http://www.rk.com/books" --> <!-- 一个XML实例文档只允许有一个默认命名空间 --> <book id="b1"> <title>最后的贵族</title> <price>49.9</price> </book> </books>