[XML]学习笔记(二)——DTD的声明与实体

本文主要探讨了XML中DTD的声明,包括内部和外部DTD的区别,以及参数实体和一般实体的详细解释,重点介绍了内部参数实体、外部参数实体、内部一般实体和外部一般实体的应用。

一、 文档类型声明:
a) 内部DTD的声明:
DTD定义语句与XML文档在同一文档,通常放在头部。格式如下:

<!DOCTYPE root_tag[
<!ELEMENT xxx (…)>
…
]>


注意在DOCTYPE后面跟的是根标记的名字。
b) 外部DTD的声明:
i.
<!DOCTYPE root_tag SYSTEM “*.dtd”>
<!ELEMENT xxx (…)>
…


ii. 参数SYSTEM表明该DTD文档是一份私有DTD;
参数PUBLIC表示该DTD文档是一份公有DTD,而且多了一个参数”LIST”,称为DTD的名字,用于标志一个DTD。一些应用程序处理DTD时会根据名字先到自己的DTD文档库中查找,当找不到时才到后一个参数指定的路径上去查找。
c) 外部DTD与内部DTD联合使用:
<!DOCTYPE root_tag SYSTEM “*.dtd” [
<!ELEMENT xxx (…)>
…
]>


当内部DTD和外部DTD在标记的定义和文档的结构定义方面发生冲突时,以内部DTD的定义为准。
二、 元素声明的语法:没有声明的就是禁止的
a) #PCDATDA型数据:标记的内容是可解析文本(不包含标记的文本),定义为#PCDATA型的标记是叶子标记,不能具有任何子标记或其他的不可解析性数据内容。
b) ANY:当很难确定一个标记的类型时可以先定义为ANY,但尽量少用(与XML文档的数据结构性相违背)。
c) +:一个或多个;
*:0个或多个;
?:0个或一个;
(tag1|tag2)+:tag1和tag2可以任意组合,只要有一个出现至少一次即可。
(tag1, tag2)*:tag1和tag2作为一个整体,要么同时出现,要么同时不出现,且出现次数与顺序要严格符合定义。等价于:
parenttag* 
<!ELEMENT parenttag (tag1, tag2)>
d) 混合型标记内容:既可以有自己的字符串内容,也可以有子标记的声明。
e.g. <!ELEMENT person (#PCDATA|name|addr|tel|email)*>
该标记是可以解析的文档内容或上面列表中的子标记,且出现次序和次数都是任意的。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (#PCDATA|name|addr|tel|email)*>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT email (#PCDATA)>
]>
<person>Chan
	<name>Jason</name>
	<addr>Shanghai</addr>
	<tel>18701772821</tel>
	<email>1368628966@qq.com</email>
	<email>18701772821@163.com</email>
</person>


注意:不能将#PCDATA作为一种特殊标记!
如 <!ELEMENT person (#PCDATA, name, addr, tel, email)>
实际上混合型标记破坏了文档的高度结构化,不利于软件对XML文档的处理,应该避免。<!ELEMENT person (#PCDATA|name|addr|tel|email)*>可转变为
<!ELEMENT person (greet|name|addr|tel|email)*>
<!ELEMENT greet (#PCDATA)>
e) 空标记:
<!ELEMENT blk EMPTY>
<blk/>(或<blk></blk>)
f) 注释:
<!--  …  -->
三、 实体:给一段代码或数据起一个名字,以便在别的地方引用。
一般实体指代的是将来XML数据文档要用到的文本或数据,而参数实体是在DTD文档内定义的一种DTD信息,所代表的是DTD定义的一部分,不能在XML文档中使用,也不能在DTD中定义。
a) 内部一般实体:在文档内部定义和使用的实体。
实体方法的引用以&开头,以;结束,中间是实体名。
e.g. 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,addr,tel,br,email)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>
<!ENTITY email "1368628966@qq.com">
]>
<person>
	<name>Jason</name>
	<addr>Shanghai</addr>
	<tel>18701772821</tel>
	<br></br>
	<email>&email;</email>
</person>


实体也可以被DTD内部的其他实体所调用:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,addr,tel,br,email)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>
<!ENTITY correspondance "email:&email;">
<!ENTITY email "1368628966@qq.com">
]>
<person>
	<name>Jason</name>
	<addr>Shanghai</addr>
	<tel>18701772821</tel>
	<br></br>
	<email>&correspondance;</email>
</person>


注意:一般实体定义只能应用在另一实体的定义中,而不能在元素(ELEMENT)的定义中。除此之外,还要注意实体之间引用的死循环问题。
b) 外部一般实体:在文档实体以外定义,要通过一个URL才能引用到的实体。
表示引用位于test323.txt的外部一般实体<!ENTITY content SYSTEM "test323.txt">
e.g. 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,addr,tel,br,email)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>
<!ENTITY correspondance "email:&email;">
<!ENTITY email "1368628966@qq.com">
<!ENTITY content SYSTEM "test323.txt">
]>
<person>
	<name>Jason</name>
	<addr>Shanghai</addr>
	&content;
</person>




test323.txt:
<tel>18701772821</tel>
<br/>
<email>&correspondance;</email>


c) 内部参数实体:参数实体不能被应用在元素的声明当中,不能使用参数实体来定义元素,只有在外部DTD中参数实体才能被应用到元素的声明当中。
e.g.
test323.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT person (name,addr,tel,br,email)>
<!ENTITY %name "(#PCDATA)">
<!ELEMENT addr %name;>
<!ELEMENT tel %name;>
<!ELEMENT br EMPTY>
<!ELEMENT email %name;>


test323.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "test323.dtd">
<person>
	<name>Jason</name>
	<addr>Shanghai</addr>
	<tel>18701772821</tel>
	<br/>
	<email>18701772821@163.com</email>
</person>


注意:参数实体必须先定义再使用,而不能像一般实体那样随意放置。
d) 外部参数实体:能将原来很长的DTD文档转变成一个很小的、相互调用的文档集合,适合大型DTD文档的设计开发。
e.g.
test323.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name,addr,tel,br,email)>
<!ENTITY % (注意这里有个空格)content SYSTEM "test323.dtd">
%content;
]>
<person>
	<name>Jason</name>
	<addr>Shanghai</addr>
	<tel>18701772821</tel>
	<br/>
	<email>18701772821@163.com</email>
</person>


test323.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT name (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ELEMENT tel (#PCDATA)>
<!ELEMENT br EMPTY>
<!ELEMENT email (#PCDATA)>


疑问:外部参数实体对应的dtd文档中能定义内部参数实体吗? 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值