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文档中编写的元素来自哪里,被谁约束。