【万能的数据传输格式XML入门教程】三、DTD约束

1. 为什么需要DTD约束

2. 什么是DTD约束文档

DTD:Document Type Definition (文档类型定义)

主要功能:约束XML的书写规范

XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等。

格式良好的XML(合法的XML):遵循XML语法的XML(满足XML详解中的七要素)

有效的XML(合理的XML):遵循DTD约束文档的XML

合理的XML文档一定是合法的XML文档,但是合法的XML文档不一定是合理的XML文档。

3. 快速入门

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE team [
    <!ELEMENT team (person+)>
    <!ELEMENT person (name,age,email)>
    <!ELEMENT name %PCDATA;>
    <!ELEMENT age %PCDATA;>
    <!ELEMENT email %PCDATA;>
]>
<team>
    <person>
        <name>吕布</name>
        <age>36</age>
        <email>lvbu@163.com</email>
    </person>
    <person>
        <name>貂蝉</name>
        <age>18</age>
        <email>xiaodiao@126.com</email>
    </person>
</team>

4. DTD约束文档分类

(1)内部DTD

内部DTD是编写在XML文档中的DTD约束。

基本语法:

<!DOCTYPE   根元素 [
    //DTD约束
]>

编写DTD约束的小技巧:从上往下依次编写

DTD语法

<!ELEMENT 元素名 元素类型>

(2)外部DTD

如果DTD约束文档独立于XML文档,我们把这种文档就称之为外部DTD

基本语法:

<!DOCTYPE 根元素名 SYSTEM "外部DTD的URI">

xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE team SYSTEM "demo06.dtd">
<team>
    <person>
        <name>吕布</name>
        <age>36</age>
        <email>lvbu@163.com</email>
    </person>
    <person>
        <name>貂蝉</name>
        <age>18</age>
        <email>xiaodiao@126.com</email>
    </person>
</team>

demo.dtd:

<!ELEMENT team (person+)>
<!ELEMENT person (name,age,email)>
<!ELEMENT name #PCDATA;>
<!ELEMENT age #PCDATA;>
<!ELEMENT email #PCDATA;>

(3)公用DTD

公用DTD主要是由第三方权威机构(W3C)编写,所有文档都必须遵循的一种约束文档

基本语法:

<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用DTD的URI">

5. DTD约束详解

  • 定义元素
  • 定义属性
  • 定义实体

(1)定义元素

<!ELEMENT 元素名称 元素类型>

主要功能:定义元素出现的名称、顺序、出现的次数...

元素说明
(#PCDATA)该类型可包含任何字符数据,但是不能包含任何子元素
EMPTY该类型不能包含子元素和文本,但可以有属性
ANY该类型可以包含任何在DTD定义的元素内容(常用于根元素)

(子元素) :定义子元素只能出现一次

(子元素1,子元素2,...) :定义子元素只能出现一次且顺序不能改变

(子元素*) :定义子元素出现的次数为0或多

(子元素+) :定义子元素出现的次数为1或多

(子元素?) :定义子元素出现的次数为0或1

(子元素1|子元素2) :互斥元素

(2)定义属性

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

主要功能:定义元素的属性类型与默认值

属性说明
CDATA字符或数字(文本类型)
(en1|en2|...)枚举类型(多选一)
ID 属性唯一要求属性必须是唯一的
IDREF 引用引入已定义的ID属性

 

默认值说明
#REQUIRED必填
#IMPLIED可选
#FIXED固定值,有值且值是固定的
默认值,有值且值是可选的

例1:CDATA与#REQUIRED

例2:枚举类型与#IMPLIED

例3:ID属性与#REQUIRED

例4:IDREF引用类型(引入已定义的ID类型)

例5:#FIXED与值区别

#FIXED固定值

值 默认值

6. 定义实体

为一段内容起一个别名,然后在文档中可以通过引用别名来实现对这段内容的引用,我们把这种情况就称之为“实体”(功能类似于PHP中的变量)

(1)引用实体

定义语法:

<!ENTITY 实体名称 "实体的值">

引用语法:

&实体名; &lt; &gt; &copy; &nbsp;

注:只能内部DTD中定义,在XML文档使用

(2)参数实体

定义语法:

<!ENTITY % 实体名称 "实体的值">

引用语法:

%实体名;

注:参数实体必须定义在外部DTD中先定义后使用。

7. 综合实例

产品目录 DTD:

详解综合案例:

(1)阅读第2行代码可知,当前XML文档的根元素为CATELOG。

(2)阅读第4-6行代码可知,当前系统一共定义了3个实体,分别为AUTHOR/COMPANY/EMAIL

(3)阅读第8行代码可知,当前系统根元素下具有多个(1或多)个PRODUCT元素

(4)阅读第10-11行代码可知,当前系统中PRODUCT元素具有4个子元素

(5)阅读12-17行代码可知,当前系统中PRODUCT元素具有多个可选属性

(6)阅读19-22行代码可知,当前系统中SPECIFICATIONS规则内具有两个可选属性

(7)阅读30-35行代码可知,当前系统中PRICE具有4个可选属性

最终结果:

转载于:https://www.cnblogs.com/chenjiacheng/p/6522283.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值