body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

XML约束之DTD:
★XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat)
★XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。
★两个概念:
            格式良好的XML:遵循XML语法的XML
            有效的XML:遵循约束文档的XML
★总之:约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。


常用的约束技术:

XML DTD
XDR
SOX
XML Schema


DTD快速入门:
DTD(Document Type Definition):文档类型定义。
作用:约束XML的书写规范
文件清单:book.xml
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">     //加入约束
<书架>
        <书>
                <书名>浪潮之巅</书名>
                <作者>吴军</作者>
                <售价>39.00元</售价>
        </书>
        <书>
                <书名>数学之美</书名>
                <作者>吴军</作者>
                <售价>28.00元</售价>
        </书>
</书架>
//约束
文件清单:book.dtd 
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>

验证XML的有效性:
★如何根据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

book.xml   //编码不能系统默认 book.dtd   //编码不能系统默认 test.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
        <书>
                <书名>浪潮之巅</书名>
                <作者>吴军</作者>
                <售价>39.00元</售价>
        </书>
        <书>
                <书名>数学之美</书名>
                <作者>吴军</作者>
                <售价>28.00元</售价>
        </书>
</书架>
<?xml version="1.0" encoding="UTF-8" ?>
<!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>

结果:
<script type="text/javascript">
//创建xml文档解析器对象
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
//开启xml校验
xmldoc.validateOnParse = "true";
//装载xml文档
xmldoc.load("book.xml");
//获取错误信息
var reason=xmldoc.parseError.reason; 
var line=xmldoc.parseError.line
document.write("reason = "+reason+"line = "+line);
</script>

编写DTD的方式:
DTD约束文档可以在XML文档中直接定义,也可以作为单独的文档进行编写(单独的文档必须以UTF-8编码进行保存) 。
在XML文档中编写DTD示例
book.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
        <!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>
]>
<书架>
        <书>
                <书名>浪潮之巅</书名>
                <作者>吴军</作者>
                <售价>39.00元</售价>
        </书>
</书架>

引入外部DTD文档:
★XML使用DOCTYPE声明语句来指明它所遵循的DTD文档,有两种形式:
     当引用的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语法细节(看懂即可):
DTD文档的语法主要涉及以下内容的定义:
定义元素 定义属性1
★在DTD文档中使用ELEMENT关键字来声明一个XML元素。
★语法:<!ELEMENT 元素名称 使用规则>
   ☞使用规则:
      ☀(#PCDATA):指示元素的主体内容只能是普通的文本.(Parsed Character Data)
      ☀EMPTY:用于指示元素的主体为空。比如<br/>     //没东西,但是可以有属性
      ☀ANY:用于指示元素的主体内容为任意类型。
      ☀(子元素):指示元素中包含的子元素
   ☞定义子元素及描述它们的关系:
      ☀如果子元素用逗号分开,说明必须按照声明顺序去编写XML文档。
如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)
      ☀如果子元素用“|”分开,说明任选其一。
如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)
      ☀用+、*、?来表示元素出现的次数
         ▪如果元素后面没有+*?:表示必须且只能出现一次
         ▪+:表示至少出现一次,一次或多次
         ▪*:表示可有可无,零次、一次或多次
         ▪?:表示可以有也可以无,有的话只能有一次。零次或一次
      ☀如: <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL*) | COMMENT)>
★在DTD文档中使用ATTLIST关键字来为一个元素声明属性。
★语法:
<!ATTLIST 元素名
                属性名1 属性值类型 设置说明
                属性名2 属性值类型 设置说明
                …
>
★例如:

<!ATTLIST 商品
                类别 CDATA #REQUIRED
                颜色 CDATA #黄色
                种类 (鸡肉|牛肉|猪肉|鱼肉)"鸡肉"
>
对应的XML为:<商品 类别=“服装” 颜色=“黄色”/>    //种类属性不写默认是鸡肉,显示写出来必须是枚举里面的值;如果上面没有"鸡肉"就不能不写

定义属性2 定义属性示例
★属性值类型:

   ☀CDATA:表示属性的取值为普通的文本字符串
   ☀枚举:只能从枚举列表中任选其一,如 (鸡肉|牛肉|猪肉|鱼肉)
   ☀ID : 表示属性的取值不能重复
★设置说明
   ☀#REQUIRED:表示该属性必须出现
   ☀#IMPLIED:表示该属性可有可无
   ☀#FIXED : 表示属性的取值为一个固定值。语法:#FIXED "固定值"
   ☀直接值:表示属性的取值为该默认值
<!ATTLIST 页面作者
             姓名 CDATA #IMPLIED
             年龄 CDATA #IMPLIED
             联系信息 CDATA #REQUIRED
             网站职务 CDATA #FIXED "页面作者"
             个人爱好 CDATA "上网"
>

<?xml version = "1.0" encoding="utf-8" standalone="yes"?>
<!DOCTYPE 购物篮 [
    <!ELEMENT 购物篮 (肉+)>
        <!ELEMENT 肉 EMPTY>
        <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
        <肉 品种="鱼肉"/>
        <肉 品种="牛肉"/>
        <肉/>
</购物篮>
定义属性示例 定义实体
★ID表示属性的设置值为一个唯一值。
<?xml version = "1.0" encoding="GB2312" ?>
<!DOCTYPE 联系人列表[
        <!ELEMENT 联系人列表 ANY>
        <!ELEMENT 联系人(姓名,EMAIL)>
        <!ELEMENT 姓名(#PCDATA)>
        <!ELEMENT EMAIL(#PCDATA)>
        <!ATTLIST 联系人 编号 ID #REQUIRED>
]>
<联系人列表>
        <联系人 编号=“a">
                <姓名>张三</姓名>
                <EMAIL>zhang@it315.org</EMAIL>
     </联系人>
        <联系人 编号=“b">
                <姓名>李四</姓名>
                <EMAIL>li@it315.org</EMAIL>
        </联系人>
</联系人列表>

★定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容
★在DTD文档中使用ENTITY关键字来声明一个实体。
★实体可分为:引用实体和参数实体,两者的语法不同
定义引用实体 定义参数实体(了解)
概念:在DTD中定义,在XML中使用
语法:<!ENTITY 实体名称 "实体内容">
引用方式(注意是在XML中使用):&实体名称;


<?xml version = "1.0" encoding="utf-8" standalone="yes"?>
<!DOCTYPE 购物篮 [
    <!ELEMENT 购物篮 (菜)>
        <!ENTITY 菜 "进口蔬菜">
        <!ELEMENT 菜 (#PCDATA)>
]>
<购物篮>
        <菜>&菜;</菜>
</购物篮>

概念:在DTD中定义,在DTD中使用
语法:<!ENTITY % 实体名称 “实体内容”>  //注意,这里有空格,怎么使用不会
引用方式(注意是在DTD中使用):%实体名称;

//内部子集中参数实体不能用在标记声明中

XML——DTD的更多相关文章

  1. XML DTD验证

    XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...

  2. JavaScripts学习日记——XML DTD Schema

    今日关键词: XML DTD Schema 1.XML 1 XML的概述 1.1 什么是XML XML全称为Extensible Markup Language,意思是可扩展的标记语言.XML语法上和 ...

  3. XML Dtd Schema

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 整体比较: XML Schema符合XML语法结构. DOM.SAX等XML API很容易解析出XML Schem ...

  4. XML DTD详解(转)

    前情提要与本文内容介绍 前面的两篇XML相关博文: 第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节 第二篇介绍DTD,引入有效的XML的概念(符合语 ...

  5. 通过实例来学习XML DTD

    使用DTD的原因: 注意:由于它自身的一些缺点,DTD终将被淘汰,但是它还是要学习的.学习完DTD后,后面继续学习XML Schema. 1,通过 DTD,您的每一个 XML 文件均可携带一个有关其自 ...

  6. XML DTD语法详解

    XML DTD详解   XML DTD详解 前情提要与本文内容介绍 前面的两篇XML相关博文: 第一篇是介绍格式正规的XML: 格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节 第二 ...

  7. XML DTD详解

    XML DTD详解 一个有效的XML文档必然是结构正规的,结构正规的XML文档不一定是有效的,即有效的是格式正规的一个子集. 本文详细介绍DTD,包括其对元素的定义,属性的定义,以及实体的定义. 元素 ...

  8. xml dtd 定义元素

    ANY 如果需要定义某个元素的值可以是任意类型,可采用如下语法 <!ELEMENT 元素名 ANY> DTD必须定义XML文档中允许出现的所有元素,所以下面这样是不行的,因为<hel ...

  9. xml dtd 内部dtd 外部DTD 公共DTD

    (一个可以用来校验xml有效性的网站:http://www.xmlvalidation.com/) (经测试 eclipse neon 对于dtd的校验并不严格,比如DOCTYPE后面的根元素名与实际 ...

随机推荐

  1. 双态运维分享之:业务场景驱动的服务型CMDB

    最近这几年,国内外CMDB失败的案例比比皆是,成功的寥寥可数,有人质疑CMDB is dead?但各种业务场景表明,当下数据中心运维,CMDB依然是不可或缺的一部分,它承载着运维的基础,掌握运维的命脉 ...

  2. 使用Atom预览markdown

    1.打开任意.md文件(markdown源文件)2.windows : ctrl + shift + pmac : command + shift + p这条命令跟Sublime Text是一样的,打 ...

  3. Selenium IDE脚本录制步骤简介

    录制脚本步骤: 1.打开Selenium IDE,输入需要录制脚本的地址,然后启动Firefox,输入selenium IDE需录制的地址,根据实际需求,做相关操作: 2.录制过程中,会发现做的相关操 ...

  4. Extjs之表单提交

    Extjs的三种提交方式: 表单Ajax提交,普通提交,单独Ajax提交: 表单Ajax提交(默认提交方式) 提交函数:当按下表单中的提交按钮时执行下面的 btn函数,按照表单的 name进行提交. ...

  5. G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛

    地址:https://nanti.jisuanke.com/t/17314 题目: Three circles C_{a}C​a​​, C_{b}C​b​​, and C_{c}C​c​​, all ...

  6. VS异常--未找到与约束 ContractName Microsoft.VisualStudio.Language.Intellisense.IGlyphService RequiredTypeIdentity

    早上打开项目的时候突然遇到这么个错误: ======================= 未找到与约束 ContractName Microsoft.VisualStudio.Language.Inte ...

  7. Vue-cli proxyTable 解决开发环境的跨域问题

    Vue-cli proxyTable 解决开发环境的跨域问题 proxyTable: { '/list': { target: 'http://api.xxxxxxxx.com', pathRewri ...

  8. zabbix-2.4.7环境部署与初始化安装

    一.zabbix简介: zabbix的特点: - 安装与配置简单,学习成本低 - 支持多语言(包括中文) - 免费开源 - 自动发现服务器与网络设备 - 分布式监视以及WEB集中管理功能 - 可以无a ...

  9. [JS] - level8 kata

    https://www.codewars.com/kata/57e3f79c9cb119374600046b function hello(name) { if(name == "" ...

  10. [kata]数值内3和5的倍数的总和求解

    这个题是这样的,方法参数接受一个数值,以3,5为基数,返回小于这个参数的3,5的倍数,加上3,5本身总和. 朋友段帅说头疼,估计是天气原因吧,好起来吧,还得战斗呢.