<?xml version="1.0" encoding="gbk" ?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>JAVA</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> <书> <书名>ANDROID</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> <书> <书名>ANDROID</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> </书架>
什么是xml约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为xml约束
为什么要使用xml约束?
使用xml进行数据交换的双方需要相互遵守的一套规则,否则双方无法进行数据交换
xml约束的作用
约束xml文档的写法
对xml进行校验
常见xml约束技术
xml DTD
xml Schema
DTD的语法
1.如和在xml中引入dtd
1.内部引入
直接在xml文件中写dtd
<!DOCTYPE 根元素名称 [dtd约束] >
2.外部引入
可以将dtd的约束内容写在外置的dtd文件中,文件后缀为.dtd
文件保存时必须使用utf-8编码保存
再在xml文件中使用
<!DOCTYPE 根元素名称 SYSTEM 文件位置 >
如果写的是SYSTEM 表明当前引入的dtd是存在于硬盘中的
<!DOCYPE 文档根结点 PUBLIC “DTD名称” “DTD文件的URL”
如果写的是PUBLIC 表示当前引入的dtd在网络中
2.dtd语法
1.元素
对元素的约束
<!ELEMENT 元素名称 元素约束条件>
约束条件:
存放类型:ANY/EMPTY
元素约束:子元素的列表,将可以包含的子元素用小括号括起来
子元素之间可以使用,进行分隔,表明子元素必须按顺序出现
还可以使用|进行分隔,表明子元素出现其中之一(只有一个)
#PCDATA 表明包含标签体
+ 表示一次或多次
* 表示0次或多次
? 表示0次或1次
也可以使用小括号进行组的操作
<!ELEMENT MYFILE ((TITLE*,AUTHOR?,EMAIL)* | COMMENT))
2.属性
<!ATTLIST 元素名
属性名 属性类型 属性约束
属性名2 属性类型 属性约束
。。。。
>
属性类型:
CDATA:表示属性的值为普通字符串
ENUMERATED:属性的值是一个枚举列表中的值 种类(科技类|文学类|工具类|xxx) #IMPLIED
ID:表明属性的值在整个文档中都是唯一的 该属性的值只能由 字母下划线开始
ENTITY:
属性约束:
#required --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错
#IMPLIED --- 表明当前属性是一个可选的属性,可以有,可以没有
#FIXED ‘固定值’ --- 表明当前属性具有一个固定值,不需要进行赋值,值为固定值,如果指定了其他值,校验报错
'默认值' --- 表明当前属性具有默认值,可以改
ENTITY(实体)
<!ENTITY> 就是对一大段内容的引用,简化代码的服用
参数实体
在dtd中引用的实体叫做参数实体
声明方式:<!ENTITY % 实体名称 实体内容>
引用方式:%实体名称
引用实体
在xml中使用的实体叫做引用实体
声明方式:<!ENTITY 实体名称 "实体内容" >
引用方式:&实体名称;
book.xml
<?xml version="1.0" encoding="gbk" ?> <!DOCTYPE 书架 SYSTEM "book.dtd"> <书架> <书> <书名>JAVA</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> <书> <书名>ANDROID</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> <书> <书名>ANDROID</书名> <作者>XXXXXX</作者> <售价>23333</售价> </书> </书架>
book.dtd
<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>
利用script打开浏览器dtd校验
<html> <head> </head> <body> 行号: <div id="l"></div><br /> 原因: <div id="r"></div> </body> </html> <script> var xmldoc = new ActiveXObject ("Microsoft.XMLDOM"); xmldoc.validateOnParse=true; xmldoc.load("book2.xml"); var line = xmldoc.parseError.line; var reason = xmldoc.parseError.reason; document.getElementById("l").innerHTML=line; document.getElementById("r").innerHTML=reason; </script>