加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

XML——DTD

发布时间:2020-12-16 23:33:05 所属栏目:百科 来源:网络整理
导读:XML约束之DTD: ★XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。(如:Tomcat) ★XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束。 ★两个概念: ? ? ? ? ? ? ?格式良好的XML:遵循XML
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> [email?protected]</EMAIL>
? ?? </联系人>
? ? ? ? <联系人 编号=“b">
? ? ? ? ? ? ? ? <姓名>李四</姓名>
? ? ? ? ? ? ? ? <EMAIL> [email?protected]</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中使用): %实体名称;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读