【风马一族_xml】xmlp之dtd1
- 什么是XML约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为xml约束
2. 为什么要使用xml约束?
参看提示栏
3. xml约束的作用?
- 约束xml的写法
- 对xml进行校验
4. 常见的xml约束技术
- xml dtd
- xml Schema
-------------------------------------------------------------------------
DTD 约束快速入门
- dtd ( document type definition ) ,全称为文档类型定义
- 示例
-
1 ------------------没有给xml设置约束-------------------------------- 2 -------------------------------book.xml--------------------------- 3 4 <?xml version="1.0" encoding="utf-8"?> 5 <书架> 6 <书> 7 <书名>Java程序设计</书名> 8 <价格>¥59</价格> 9 <作者>风马一族</作者> 10 </书> 11 <书> 12 <书名>C++程序设计</书名> 13 <价格>¥49</价格> 14 <作者>风马一族</作者> 15 </书> 16 </书架> 17 18 ---------使用DTD技术,给xml设置约束,使xml内容出现错误的示例----- 19 -----------------------book.xml------------book.dtd----------------------- 20 <?xml version="1.0" encoding="utf-8"?> 21 <!DOCTYPE 书架 SYSTEM "book.dtd"> 22 <书架> 23 <书> 24 <书名>Java程序设计</书名> 25 <价格>¥59</价格> 26 <作者>风马一族</作者> 27 </书> 28 <书> 29 <书名>C++程序设计</书名> 30 <价格>¥49</价格> 31 <作者>风马一族</作者> 32 </书> 33 </书架> 34 35 <!ELEMENT 书架(书+)> 36 <!ELEMENT 书(书名,作者,售价)> 37 <!ELEMENT 书名(#PCDATA)> 38 <!ELEMENT 作者(#PCDATA)> 39 <!ELEMENT 售价(#PCDATA)> 40 41 42 ---------使用DTD技术,给xml设置约束,使xml内容按照约束写法的示例----- 43 -----------------------book.xml------------book.dtd----------------------- 44 45 <?xml version="1.0" encoding="utf-8"?> 46 <!DOCTYPE 书架 SYSTEM "book.dtd"> 47 <书架> 48 <书> 49 <书名>Java程序设计</书名> 50 <作者>风马一族</作者> 51 <售价>¥59</售价> 52 </书> 53 <书> 54 <书名>C++程序设计</书名> 55 <作者>风马一族</作者> 56 <售价>¥59</售价> 57 </书> 58 </书架> 59 60 <!ELEMENT 书架 (书+)> 61 <!ELEMENT 书 (书名,作者,售价)> 62 <!ELEMENT 书名 (#PCDATA)> 63 <!ELEMENT 作者 (#PCDATA)> 64 <!ELEMENT 售价 (#PCDATA)>
-
-------------------------------------------------------------------------
1.编程校验xml文档正确性
- 1.默认的情况下IE浏览器内置的xml解析器的约束校验器是被关闭了的。所以我们需要使用JavaScript手动创建解析器对象。打开约束校验功能,对xml进行约束校验。
2.创建xml文档解析器对象
1.var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
3.开启xml校验
1.xmldoc.validateOnParse="true";
4.装载xml文档
1.xmldoc.load("book.xml");
5.获取错误信息
1.xmldoc.parseError.reason;
2.xmldoc.parseError.line
------------------------------------
因为IE默认不打开DTD校验器,因此可以使用两种方式,解决这个问题,一是使用TDE、二是编写一段JS
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>无标题文档</title> 5 </head> 6 7 <body> 8 行号: <div id="l"></div><br /> 9 原因: <div id="r"></div> 10 </body> 11 </html> 12 13 <script> 14 var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); //使用javaScript创建一个浏览器内置的xml解析器 15 xmldoc.validateOnParse=true;//将xml解析器的dtd校验打开 16 xmldoc.load("book.xml"); 17 var line=xmldoc.parseError.line; 18 var reason=xmldoc.parseError.reason; 19 document.getElementById("l").innerHTML=line; 20 document.getElementById("r").innerHTML=reason; 21 </script>
------------------------------------
示例
------------book.xml-------------
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE 书架 SYSTEM "book.dtd"> 3 <书架> 4 <书> 5 <书名>Java程序设计</书名> 6 <作者>风马一族</作者> 7 <售价>¥59</售价> 8 </书> 9 <书> 10 <书名>C++程序设计</书名> 11 <作者>风马一族</作者> 12 <售价>¥59</售价> 13 </书> df 14 </书架>
------------book.dtd-------------
1 <!ELEMENT 书架 (书+)> 2 <!ELEMENT 书 (书名,作者,售价)> 3 <!ELEMENT 书名 (#PCDATA)> 4 <!ELEMENT 作者 (#PCDATA)> 5 <!ELEMENT 售价 (#PCDATA)>
------------check.html------------
1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 4 <title>无标题文档</title> 5 </head> 6 7 <body> 8 行号: <div id="l"></div><br /> 9 原因: <div id="r"></div> 10 </body> 11 </html> 12 13 <script> 14 var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); //使用javaScript创建一个浏览器内置的xml解析器 15 xmldoc.validateOnParse=true;//将xml解析器的dtd校验打开 16 xmldoc.load("book.xml"); 17 var line=xmldoc.parseError.line; 18 var reason=xmldoc.parseError.reason; 19 document.getElementById("l").innerHTML=line; 20 document.getElementById("r").innerHTML=reason; 21 </script>
结果:
-----------------------------------------------------------------------------------
二、dtd语法
1,如何在xml中引入dtd
- 外部引入
- 可以将dtd的约束内容写在外置的dtd文件中,这个文件后缀必须为.dtd而文件保存时必须用UTf-8来保存。
- 再在xml文件中使用<!DOCTYPE 根元素名称 SYSTEM 文件的位置>
- 如果写的是SYSTEM表明当前引入的dtd在当前文件系统中,后面制定的文件位置是当前硬盘中的位置
- 再在xml文件中使用<!DOCTYPE 根元素名称 PUBLIC 文件的位置>
- 如果写的是PUBLIC表明当前引入的dtd在网络公共位置中,后面要指明dtd的名字和dtd所在网络位置URL地址
- 示例:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- 内部引入
- 直接在xml中书写dtd
- <!DOCTYPE 根元素名称[dtd约束]>
- 外部引入
- dtd语法
- 元素
- <!ELEMENT 元素名称 元素约束>
- 元素约束:
- 存放类型:ANY/EMPTY
- 元素约束:
- 子元素的列表,将可以包含的子元素用小括号括起来
- 子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现
- 子元素之间可以使用竖线进行分割,表明子元素出现其中之一
- #PCDATA 表明包含标签体
- + 表示一次或多次
- * 0次或多次
- ? 0次或一次
- 也可以使用小括号进行组的操作
- 属性
- <!ATTLIST 元素名
- 属性名 属性类型 属性约束
- 属性名2 属性类型 属性约束
- .......................
- >
示例:
-
1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE 书架[ 3 <!ELEMENT 书架 (书+)> 4 <!ELEMENT 书 (书名,作者,售价)> 5 <!ELEMENT 书名 (#PCDATA)> 6 <!ELEMENT 作者 (#PCDATA)> 7 <!ELEMENT 售价 (#PCDATA)> 8 9 ]> 10 <书架> 11 <书> 12 <书名>Java程序设计</书名> 13 <作者>风马一族</作者> 14 <售价>¥59</售价> 15 </书> 16 <书> 17 18 <书名>C++程序设计</书名> 19 <作者>风马一族</作者> 20 <售价>¥59</售价> 21 </书> 22 </书架>
-
- 属性类型: 属性的可以是一组取值的列表,在xml文件中设置的属性值
- CDATA : 表示属性的值是一个普通字符串
- ENUMERATED:属性的值是一个枚举列表中的值
- ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID属性的值只能由字母,下划线开始,不能使用数字,不能出现空白字符
- 属性约束:
- #REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错
- #IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有
- #FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值,如果
- ’默认值‘ --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值
- <!ATTLIST 元素名
- ENTITY(实体)
- <!ENTITY> 就是对一大段内容的引用,可以简化代码的复用
- 引用实体:
- 在xml中引用的实体叫做引用实体
- <!ENTITY % 实体名称 “实体内容”>
- &实体名称;
- 参数实体:
- 在dtd中引用的实体叫做参数实体
- <!ENTITY % 实体名称 “实体内容”>
- &实体名称;
- 元素