XML 的 约束 :DTD 、 Schema

XML约束:

XML 文件的书写,是要遵守一定的书写格式的,这样,在解析的时候才能让机器读懂你什么意思。在 XML 技术里,可以编写一个文档来约束一个 XML 文档的书写规范,这称之为 XML 约束。一共有两种约束方式 XML DTD 和 XML Schema。


1、DTD

1.1 DTD 范例

Document Type DeFinition ,全称为“文档类型定义”。例如:

book.dtd

<!ELEMENT 书架 (书+)>
	<!ELEMENT 书 (书名,作者,售价)>
		<!ELEMENT 书名 (#PCDATA)>
		<!ELEMENT 作者 (#PCDATA)>
		<!ELEMENT 售价 (#PCDATA)>
book.xml
<?xml version="1.0" ?>
<!DOCTYPE 书架 SYstem "book.dtd">
<书架>
	<书>
		<书名>JAVA</书名>
		<作者>海竹</作者>
		<售价>30.0</售价>
	</书>
	<书>
		<书名>WEB</书名>
		<作者>西行</作者>
		<售价>29.9</售价>
	</书>
</书架>
dtd 文件中的格式一点都不能错,空格也不能错。(#PCDATA) 就是 parse character data “可解析的数据”,也就是字符串。

三个标签:书名、作者、售价,在使用的时候一个都不能少,也不能超出这个范围。


1.2、DTD引用:

两种方式:一个是引用本地文件一个是引用网络文件

本地文件

<!DOCTYPE 文档根节点 SYstem "DTD文件的URL">

公共文件

<!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
例如:
<!DOCTYPE 书架 SYstem "book.dtd">

<!DOCTYPE web-app PUBLIC
	"-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
	"http://java.sun.com/dtd/web-app_2_3.dtd">

<!DOCTYPE module PUBLIC
    "-//puppy Crawl//DTD Check Configuration 1.2//EN"
    "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

1.3、DTD定义的细节:

1.3.1 元素

<!ELEMENT 书架 (书+)>
	<!ELEMENT 书 (书名,售价)>
		<!ELEMENT 书名 (#PCDATA)>
		<!ELEMENT 作者 (#PCDATA)>
		<!ELEMENT 售价 (#PCDATA)>

第一行:

|——(书+):表示只能存放一本或者多本书

|—— +:一本或多本

|—— * :0本或多本

|—— ?:0本或一本
|——如果将 ”(书+)“ 换成 ”ANY“,就可以放书之外的东西

第二行:

|——(书名,售价):使用逗号分隔,在文件中必须包含这三个元素,且只能是这三个元素

|——(书名|作者|售价):如果使用”|“分隔,则可以选择的使用三个元素中的元素

另外,可以使用圆括号批量设置:

<!ELEMENT MYFILE((TITLE?,AUTHOR+,EMAIL)*|COMMENT)>
1.3.2 属性(attribute)

1.3.2.1 语法

XML中的标签属性需要通过ATTLIST 为其设置属性,语法格式如下:

<!ATTLIST 元素名
	属性名1   属性值类型   设置说明
	属性名2   属性值类型   设置说明
	……
>
范例:
<!ATTLIST 商品
	类别 CDATA #required
	颜色 CDATA #IMPLIED
	产地 CDATA #FIXED "China"
	真伪 CDATA "真"
>

这表示商品这个元素一共有四个属性:类别、颜色、产地、防伪结果。类别是必填项,颜色、产地、真伪是可选项,产地只能是”China“这个值,防伪认为”真品“。

在XML 中使用的范例:
	<商品 类别="服装" 颜色="红色" 产地="China" 真伪="真">裤子</商品>
	<商品 类别="服装" 真伪="假">裤子</商品>
	<商品 类别="服装">裤子</商品>
1.3.2.2 属性值类型

a、CDATA:普通文本字符串

b、ENUMERATED:枚举

c、EMPTY:

d、ID:唯一

1.3.3 实体定义

1.3.3.1 格式:

<!ENTITY……>

1.3.3.2 引用实体 和 参数实体

A:引用实体:

语法格式:

<!ENTITY 实体名称 "实体内容">
引用方式:&实体名称

范例:(这个例子有问题)

book.dtd

<!ENTITY bookname "Think in JAVA">

<!ELEMENT 书架 ANY>
<!ELEMENT 书 (书名,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

<!ATTLIST 书名
	ISBN码 CDATA #IMPLIED
>
book.xml
<?xml version="1.0" ?>
<!DOCTYPE 书架 SYstem "book.dtd">
<书架>
	<书>
		<书名>&bookname;</书名>
		<作者>海竹</作者>
		<售价>30.0</售价>
	</书>
	<书>
		<书名 ISBN码="521">&bookname;</书名>
		<作者>西行</作者>
		<售价>29.9</售价>
	</书>
</书架>

B:参数实体:

语法格式:

<!ENTITY % 实体名称 "实体内容">
引用方式:&实体名称
范例:
<!ENTITY % PERSON_INFO "姓名|EMAIL|电话|地址">

<!ELEMENT 个人信息 (%PERSON_INFO;|生日)>
<!ELEMENT 客户信息 (%PERSON_INFO;|公司名)>
相当于:
<!ELEMENT 个人信息 (姓名|EMAIL|电话|地址|生日)>
<!ELEMENT 客户信息 (姓名|EMAIL|电话|地址|公司名)>





2、Schema

2.1 简介

schema是为了克服dtd的局限性,并将之取代,而产生的一门语言。XML Schema 文件自身就是一个 XML 文档,但他的扩展名通常为 “.xsd”。一个 XML Schema文档通常称之为模式文档(约束文档),遵循这个文档成成的xml文件称之为实例文档。和 XML 一样,一个 XML Schema必须由一个根节点,但是这个跟节点名称必须为 shema。

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

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念