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

xml之dtd介绍

发布时间:2020-12-16 08:51:41 所属栏目:百科 来源:网络整理
导读:为什么需要dtd: dtd的主要用处是约束xml文件,也可去约束html、html... 快速入门: 在xml文件中引入dtd约束文件 classes2.xml span style="font-size:18px;"?xmlversion="1.0" encoding="utf-8"?!--一定保证文件的保存的编码方式和 utf-8一致--!--引入dtd--!D

为什么需要dtd:

dtd的主要用处是约束xml文件,也可去约束html、html...

快速入门:

在xml文件中引入dtd约束文件

classes2.xml

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!--一定保证文件的保存的编码方式和 utf-8一致-->
<!--引入dtd-->
<!DOCTYPE班级 SYSTEM "classes2.dtd">
<班级>
       <学生>
              <名字>周星驰</名字>
              <年龄>23</年龄>
              <介绍>学习刻苦</介绍>
              <面积>20</面积>
       </学生>
       <学生>
              <名字>林青霞</名字>
               <年龄>32</年龄>
              <介绍>是一个好学生</介绍>
       </学生>
</班级></span>

dtd文件如下:

classes2.dtd

<span style="font-size:18px;"><!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,年龄,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)></span>

? 在默认情况下,浏览器不会去检测dtd约束条件.,我们需要自己写代码测试(这里有点新知识js),自己写一个测试工具文件

checkDTD.html

<span style="font-size:18px;"><html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=utf-8"/>
<scriptlanguage="javascript">
<!--
       //创建一个xml解析器
       var xmldoc = newActiveXObject("Microsoft.XMLDOM");
       //开启校验功能
       xmldoc.validateOnParse =true;
       //指定对哪个 xml文件校验
       xmldoc.load("classes2.xml");
       //如果有错误信息,则输出
       document.write("错误信息="+xmldoc.parseError.reason+"<br/>"); 
       document.write("错误的行号="+xmldoc.parseError.line+"<br/>");
//-->
</script>
</head>
</html></span>

上面是将外部dtd文件引入xml文件中,除此之外,还可以直接在xml文件中写入dtd文件内容,即内部dtd

classes3.xml

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!--一定保证文件的保存的编码方式和 utf-8一致-->
<!--引入dtd-->
<!DOCTYPE 班级 [
       <!ELEMENT 班级 (学生+)>
<!ELEMENT 学生 (名字,介绍)>
<!ELEMENT 名字 (#PCDATA)>
<!ELEMENT 年龄 (#PCDATA)>
<!ELEMENT 介绍 (#PCDATA)>
]>
<班级>
       <学生>
              <名字>周星驰</名字>
              <年龄>23</年龄>
              <介绍>学习刻苦</介绍>
       </学生>
       <学生>
              <名字>林青霞</名字>
               <年龄>32</年龄>
              <介绍>是一个好学生</介绍>
       </学生>
</班级></span>

在xml文件中引入dtd文件有两种方式:

① 本地引用

<!DOCTYPE 根元素名 SYSTEM “被引入的dtd文件的路径”>

② 引入一个公开的dtd(网络中的dtd文件)

<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

dtd的元素说明

基本语法

<!ELEMENT 元素名 元素规范>

元素名有三个规范:

EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)

ANY-该元素可以包含任何在DTD中定义的元素内容

#PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素

其它类型(组合)

我们的元素的几个修饰符

? 0到1

+ 1到多

* 0到多

| 表示选择

, 表示元素出现的顺序

dtd元素属性列表说明

基本语法

<!ATTLIST 元素名字

属性名 属性类型 属性的特点

属性名 属性类型 属性的特点

>

属性类型有:

CDATA[表示属性值可以是字符或者数字]
ID [属性值是唯一的,字母开头 ]
IDREF/IDREFS [id引用]
Enumerated [枚举]
ENTITY/ENTITIES [实体]

属性的特点

#REQUIRED【该属性必须有】

#IMPLIED【该属性可以有可以没有】

#FIXED value [该属性的值是固定值]

DEFAULT value [默认值]


说明IDREF/ IDREFS的用法:

IDREF 引用一个

IDREFS 引用多个

案例:

<span style="font-size:18px;"><学生 住址="香港" 大佬="a002 a003" 学号="a001">
              <名字>周星驰</名字>
              <年龄>23</年龄>
              <介绍>学习刻苦</介绍>
</学生></span>

对应的dtd

<span style="font-size:18px;"><!ATTLIST 学生
       住址 CDATA#IMPLIED
       学号 ID#REQUIRED
       大佬 IDREFS#REQUIRED
> </span>

实体定义

分为两种

1. 引用实体

举例说明:

在dtd中定义:

<!ELEMENT 班级 (学生+,班长?)>

<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->

<!ENTITY intro "这是一个介绍">


在xml文件中引用:


<介绍>&intro;学习刻苦</介绍>

运行该xml文件时,此处显示:

<介绍>这是一个介绍学习刻苦</介绍>


2. 参数实体

举例:

<span style="font-size:18px;"><!ELEMENT 班级 (学生+,班长?)>
<!--定义一个引用实体,建议大家把引用实体的定义放在前面-->
<!ENTITY intro "这是一个介绍">
<!--定义一个参数实体-->
<!ENTITY  %  sName  "名字">
<!ATTLIST 学生
住址 CDATA #IMPLIED
学号 ID #REQUIRED
大佬 IDREFS #REQUIRED
婚姻状态 (单身|结婚|离婚) #REQUIRED
国籍 CDATA #FIXED "中国"
> 
<!—注意要带分号-->
<!ELEMENT 学生(%sName;,介绍)>
<!ELEMENT %sName; (#PCDATA)>
<!ELEMENT 年龄(#PCDATA)>
<!ELEMENT 介绍(#PCDATA)>
<!ELEMENT 班长(#PCDATA)></span>

综合练习:

假设项目经理,定义了一个dtd文件.要求我们程序员根据dtd来编写一个合法和符合dtd规范的xml.

myDtd.dtd

<span style="font-size:18px;"><!ENTITY AUTHOR"John Doe">
<!ENTITYCOMPANY "JD Power Tools,Inc.">
<!ENTITY EMAIL"jd@jd-tools.com">
 
<!ELEMENTCATALOG (PRODUCT+)>
 
<!ELEMENTPRODUCT
(SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)>
<!ATTLISTPRODUCT
NAME CDATA#IMPLIED
CATEGORY(HandTool|Table|Shop-Professional) "HandTool"
PARTNUM CDATA#IMPLIED
PLANT (Pittsburgh|Milwaukee|Chicago)"Chicago"
INVENTORY(InStock|Backordered|Discontinued) "InStock">
 
<!ELEMENTSPECIFICATIONS (#PCDATA)>
<!ATTLISTSPECIFICATIONS
WEIGHT CDATA#IMPLIED
POWER CDATA#IMPLIED>
 
<!ELEMENTOPTIONS (#PCDATA)>
<!ATTLISTOPTIONS
FINISH (Metal|Polished|Matte)"Matte"
ADAPTER(Included|Optional|NotApplicable) "Included"
CASE(HardShell|Soft|NotApplicable) "HardShell">
 
<!ELEMENT PRICE(#PCDATA)>
<!ATTLIST PRICE
MSRP CDATA#IMPLIED
WHOLESALE CDATA#IMPLIED
STREET CDATA#IMPLIED
SHIPPING CDATA#IMPLIED>
 
<!ELEMENT NOTES(#PCDATA)></span>

xml文件:

<span style="font-size:18px;"><?xmlversion="1.0" encoding="utf-8"?>
<!DOCTYPECATALOG SYSTEM "products.dtd">
<CATALOG>
<PRODUCTNAME="冰箱" CATEGORY="HandTool"PLANT="Chicago" INVENTORY="Discontinued">
<SPECIFICATIONSWEIGHT="80kg" POWER="1000w">这是国产海尔冰箱</SPECIFICATIONS>
<PRICE>1000</PRICE>
<NOTES>轻拿轻放</NOTES>
</PRODUCT>
</CATALOG></span>

(编辑:李大同)

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

    推荐文章
      热点阅读