XML约束——DTD约束
约束
- XML技术中,可以编写一个文档来约束一个XML的书写规范,约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
- 常见约束 XML DTD 和 XML Schema
根据DTD来验证XML
需要解析器(软件程序)
根据能否对XML文档进行约束模式校验,可以将解析器分为两类:
非校验解析器(IE)和校验解析器
编程校验XML文档的正确性
IE5以上浏览器内置了XML解析工具:Microsoft.XMLDOM,可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证
- 创建xml文档解析器对象
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
- 开启xml校验
xmldoc.validateOnParse = "true";
- 装载xml文档
xmldoc.load("book.xml");
- 获取错误信息
xmldoc.parseError.reason;
xmldoc.parseError.line
编写DTD (内部定义,外部引用)
内部定义
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>浪潮之巅</书名>
<作者>吴军</作者>
<售价>39.00元</售价>
</书>
</书架>
引入外部DTD文档(文档必须以UTF-8编码进行保存)
- 当引用的DTD文档在本地时,采用如下方式:
<!DOCTYPE 根元素 SYSTEM “DTD文档路径”>
如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
- 当引用的DTD文档在公共网络上时,采用如下方式:
<!DOCTYPE 根元素 PUBLIC “DTD名称” “DTD文档的URL”>
如:<!doctype html public "-/w3c/dtd html 4.01/en" "http://www.w3.org/tr/html4/strict.dtd">
DTD文档的语法:
定义元素
使用ELEMENT关键字来声明一个XML元素
语法:<!ELEMENT 元素名称 使用规则>
使用规则:
(#PCDATA):指示元素的主体内容只能是普通的文本. (Parsed Character Data)
EMPTY:用于指示元素的主体为空。比如<br/>
ANY:用于指示元素的主体内容为任意类型
(子元素):指示元素中包含的子元素
定义子元素及描述它们的关系:
如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如果子元素用“|”分开,说明任选其一。
用+、*、?来表示元素出现的次数
如果元素后面没有+*?:表示必须且只能出现一次
+:表示至少出现一次,一次或多次
*:任意次。表示可有可无,零次、一次或多次
?:表示可以有也可以无,有的话只能有一次。零次或一次
定义属性
使用ATTLIST关键字来为一个元素声明属性
`语法:
<!ATTLIST 元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
…
**属性值类型:**
CDATA:表示属性的取值为普通的文本字符串
枚举,只能从枚举列表中任选其一ID:表示属性的取值不能重复
**设置说明**
#REQUIRED:表示该属性必须出现#IMPLIED:表示该属性可有可无
#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
直接值:表示属性的取值为该默认值`
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
定义实体
定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。在DTD文档中使用ENTITY关键字来声明一个实体。
实体可分为:引用实体和参数实体,两者的语法不同
定义引用实体
概念:在DTD中定义,在XML中使用
语法:<!ENTITY 实体名称 “实体内容”>
引用方式(在XML中使用):&实体名称;
定义参数实体(了解)
概念:在DTD中定义,在DTD中使用
语法:<!ENTITY % 实体名称 “实体内容”>
引用方式(在DTD中使用):%实体名称;