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 根元素 [元素声明]>

实例:

<?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>

展示:

wKiom1c0ztuyMDN-AAAI5q3ceQA951.png

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

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>