XML文档是1种元标记语言,即1种定义标记语言的语言。在XML中可以创建新的标记语言,这些新的标记语言(也叫标记集)要通过文档类型定义(Document Type Definitions,DTD)来定义。DTD文档是这些新的标记语言的法律性文档。如果XML文档的语法符,DTD的定义和规定,那末就称为1个合法的XML文档,否则就是非法的XML文档。合法的XML文档在实际利用中的地位很重要,由于只有合法的XML文档才能被利用软件有效地处理。
DTD定义了文档的逻辑结构,规定了文档中所使用的元素、实体、元素的属性、元素与实体之间的关系。其作用主要表现在以下几个方面。
(1) 使用DTD可以提供1种统1的格式。XML的可扩大性为文档的作者提供了很高的灵活性,可有时候需要的是统1,要求某1类文档具有相同的结构。
(2) 使用DTD可以保证数据交换和同享的顺利进行。
(3) DTD使用户能够不依赖具体的数据就知道文档的逻辑结构。在没有XML文档的时候,也能够根据DTD为XML文档编写样式单,编写处理程序,这样可以有效地提高工作效力。
(4) 使用DTD可以验证数据的有效性。DTD对文档的逻辑结构进行了束缚,这类束缚可以比较宽松,也能够10分严格。可以根据DTD检查数据,以验证其是不是符合规定和要求,这可以保证数据的正确和有效。
DTD中描写的基本部件是元素和属性,它们负责肯定XML文档的逻辑结构。元素表示1个信息对象,而属性表示这个对象的性质。所有元素中有且只有1个根元素,其他的元素都是它的子元素,除根元素外,每一个元素都被其他元素包括,1个元素可以有几个不同类型的子元素。
-元素的基本类型 元素的基本类型大致可分为两种,1种称为简单型,另外一种称为复合型。简单型具有文本数据,便可析字符数据,该类型也称为上下文中的“#PCADTA”;复合型可以包括其他元素和文本数据。
<!ELEMENT Element_Name (#PCDATA )>
“#PCDATA”的用法,代码以下所示。
?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
2.-元素的声明
1. 元素声明的基本语法
元素的声明格式:
<ELEMENT Element_Name Element_Defination>
其中,Element_Name为声明的元素名称,Element_Defination为元素内容格式的定义。
合法的元素声明语句如:
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT publisher (#PCDATA)>
<ELEMENT Element_Name EMPTY>
例以下面的语句:
<ELEMENT hr EMPTY>
<!ELEMENT Element_Name ANY>
而在文档刚开始定义时,其实不明确将来的利用领域中会有多少个元素,所以唯1的做法就是标记为ANY类型,表示可以包括任何元素和可解析数据。例如:
<!ELEMENT person ANY>
然后在文档的实际开发进程中再逐渐完善该元素的子元素的具体定义,将ANY关键字替换掉。
【例4.3】 ANY的用法,代码如源程序code4_3.xml所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ANY>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
文档中能有多个ANY型的元素吗?这是完全可以的,由于ANY型的元素不1定是根元素。
包括多个ANY型元素的XML文档,代码下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ANY>
<!ELEMENT title ANY>
<!ELEMENT author ANY>
<!ELEMENT publisher ANY>
<!ELEMENT price ANY>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
ANY型的元素在文档中应尽可能少使用,由于这与XML文档的数据结构性相背背。但多数情况之下在定义1个元素的所有子元素之前,总是首先以ANY代替,最后再以实际的子元素替换ANY关键字,定义出具体的DTD文档。
4. 子元素列表的设定
在XML中有1种针对复合元素的最为严格的设定方法,称为子元素列表的设定。这类方式下,元素都具有哪些子元素、每一个子元素出现的次数和位置都有明确的规定,在具体文档实现时,必须严格履行。
子元素列表的设定语法以下:
<!ELEMENT Element_Name(Child_Element1, Child_Element2,…)>
其中“(Child_Element1, Child_Element2,…)”部份为Element_Name所具有的子元素列表。
【例4.5】 子元素列表的设定,代码以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<pubdate>2004.6</pubdate>
<ISBN>7-04-014768⑻</ISBN>
</publish>
<price>19.7</price>
</bookinfo>
上面程序是1个不合法的文档,缘由在于,标记<pubdate></pubdate>
和<ISBN></ISBN>
的使用顺序与DTD中定义的顺序不1致。在1个标记后面的子标记列表中,子标记出现的次序代表了将来XML文档中的子标记出现次序,而且这类次序不能被背背。
5. 可选择的子元素
有些时候,需要在两个或多个互斥的元素中进行选择。即多选1的情况,如1个人的性别可以是男或女,二者中只能有1种情况。DTD有专门的语法来处理这类情况,其语法格式以下:
<!ELEMENT Element_Name(Child_Element1|Child_Element2|……)>
其中,“(Child_Element1|Child_Element2|…)”部份为选择性元素组合,具体使用时必须要在这个列表当选择其1。
【例4.6】 选择性元素列表的设定,代码以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher|ISBN|pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
</publish>
<price>19.7</price>
</bookinfo>
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo ((title,author,price)+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<price>19.7</price>
<title>3国演义</title>
<author>罗贯中</author>
<price>50.0</price>
</bookinfo>
在实际利用中,使用元素组可能不是最好的方案。这时候也能够先将准备分组的元素定义为1个复合元素,再在原来的元素中援用刚定义的复合元素,这样文档的结构更清晰。
【例4.8】 较好的方案,代码以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT maininfo (title, author, price)>
<!ELEMENT bookinfo (booknumb, maininfo+)>
<!ELEMENT booknumb (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<booknumb>2</booknumb>
<maininfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<price>19.7</price>
</maininfo>
<maininfo>
<title>3国演义</title>
<author>罗贯中</author>
<price>50.0</price>
</maininfo>
</bookinfo>
<!ELEMENT Element_Name(#PCDATA|Child_Element1|Child_Element2,…)>
混合型元素的存在破坏了文档的层次结构化,不利于利用软件对XML文档的处理,在XML文档开发进程中,它可以作为1个不成熟的DTD文档,1步1步地在XML文档中添加元素,边添加边测试其正确性,这时候可将还没有处理的部份作为字符数据组织到1个混合型元素中,以便使文档通过测试。但在文档最后完成时,要通过添加新元素的方法来清除这类非结构化信息。
4.3.1 属性的声明
在DTD中,属性的声明格式:
<!ATTLIST Element_name Attribute_name TYPE Default_value>
其中,<!ATTLIST>
为属性声明的关键字,Element_name为元素名,Attribute_name为属性名,TYPE是属性类型,Default_value为没有设定属性值时的默许值。
【例4.9】 属性的声明,代码以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publisher,price)>
<!ATTLIST bookinfo ISBN CDATA "7-04-014768⑻">
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo ISBN="7-04-014768⑻">
<title>计算机导论</title>
<author>丁跃潮等</author>
<publisher>高等教育出版社</publisher>
<price>19.7</price>
</bookinfo>
图4.5 属性的声明
在声明属性时有以下需要注意的事项。
(1) 可以屡次为1个元素声明其中所包括的属性。如在XML文档中有以下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
属性声明可以为
<!ATTLIST bookinfo id CDATA "001">
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ELEMENT bookinfo (#PCDATA)>
(2) 属性的声明在文档中的次序没有严格的要求,可位于与其相连的元素声明之前或以后。如在XML文档中有以下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
属性声明可以为
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
(3) 所有元素的属性,都要在各自所对应的标记中声明。如在XML文档中有以下语句:
<bookinfo id="001" bookcategory="文艺" >
</bookinfo>
<publish publisher="高等教育出版社" ISBN="7-04-014768⑻">
</publish>
属性声明可以为
<!ATTLIST bookinfo bookcategory CDATA "文艺" >
<!ATTLIST bookinfo id CDATA "001">
<!ELEMENT bookinfo (#PCDATA)>
<!ATTLIST publish publisher CDATA "高等教育出版社" >
<!ATTLIST publish ISBN CDATA "7-04-014768⑻">
<!ELEMENT publish (#PCDATA)>
(4) 属性有4种不同类型的默许值,可在属性声明中的Default_value部份指定。
① default:表示使用提供的默许值,default不是1个关键字,它代表1个预设的字符串。
<!ATTLIST bookinfo bookcategory("文艺"|"自然科学")"文艺" >
此例句表示当在XML文档中省略了对bookinfo元素的bookcategory属性值进行设定时,该属性的默许值就是“文艺”。
② #REQUIRED:表示属性值必须指定。
③ #IMPLIED:表示元素的这个属性可用可不用。
④ #FIXED:表示元素的这个属性值是1个固定值,且必须是指定的值。
4.3.2 属性的类型
在属性的声明中TYPE部份为属性的类型设定,DTD中属性的类型有10种,下面将对这些数据类型进行逐1的介绍。
1. CDATA型
CDATA型表明属性值为不包括“<”和“””的任意字符串,如果属性值中需要包括“<”和“””,则可以使用特殊字符来代替。
2. Enumerated型
如果属性值其实不是任意的字符串,而是在几个可能的值中进行选择,如书籍的“种别”属性,其值可为“文艺”,也可为“自然科学”,而不可能为其他情况时,则可以将书籍的“种别”属性设定为Enumerated型。
3. ID型
当元素的某个属性值是不能重复时,如书籍的ISBN属性、个人的“身份证号”属性等,要定义这样的属性则需使用属性的ID类型。在1个XML文档中,所有元素的ID类型属性的属性值必须是唯1的,不可重复,另外,1个元素不能有超过1个ID类型的属性。
4. IDREF与IDREFS型
IDREF为Identifier Reference的缩写,IDREF与ID类型属性的关系为子元素与父元素的关系,即IDREF类型属性的值必须是其他元素的ID类型属性的值,且该ID类型属性的值必须在文档的其他地方被设定过。IDREFS类型属性的属性值可有多个,每个都必须是在文档其他地方被设定了的ID类型属性的值,而这多个属性值之间用空格隔开。
【例4.10】 IDREFS的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE school [
<!ELEMENT school (teacher, subject*)>
<!ELEMENT teacher (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ATTLIST teacher
teach IDREFS #IMPLIED
>
<!ATTLIST subject
number ID #REQUIRED
>
]>
<school>
<teacher teach="c0001 c0002 c0003">
丁潇
</teacher>
<subject number="c0001">
PowerBuilder
</subject>
<subject number="c0002">
AutoCAD
</subject>
<subject number="c0003">
XML
</subject>
</school>
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username, password, picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED
>
<!ATTLIST customer
ID #REQUIRED
>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103">
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2"/>
</customer>
<customer ID="c0500208">
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4"/>
</customer>
</customers>
本例不是所有XML阅读器都可以自动辨认的通用格式,仅仅某些阅读器和利用程序可能采取的在文档中嵌入非XML数据的方法而已。
6. NMTOKEN与NMTOKENS型
NMTOKEN类型的属性限定属性值是有效的XML名称,这个属性值可以由英文、数字、“.”、 “_”、“-”、“:”等组成,这里有几点需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”之外,其他字符都可以作为开头字符。
(3) “:”可以出现在中间,但由于它是命名域的关键字符,所以1般不提倡使用。
正由于NMTOKEN类型的属性对字符的严格要求,使得它在1些经常使用编程语言中,都是合法的数据,这就为这些编程语言对XML文档数据的操作打下了良好的基础。
NMTOKENS类型的属性具有与NMTOKEN属性相近的情势。这类类型的属性可使以下情况合法——属性由若干XML名称组成,彼其间由空格隔开。通常可为使用NMTOKEN属性相同的理由而使用NMTOKENS属性,但仅仅在需要多个名字的时候。
7. NOTATION型
XML文档中引入了外部不可解析的实体后,解析器没法解析这些2进制文件,这时候,就能够使用NOTATION类型的属性为这些2进制文件指定与其对应的利用软件以对其进行处理。
【例4.12】 NOTATION的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username,password,picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!NOTATION mspaint SYSTEM "C:\WINDOWS\system32\mspaint.exe">
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED>
<!ATTLIST picture procedure NOTATION #REQUIRED>
<!ATTLIST customer ID ID #REQUIRED>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103" >
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2" procedure="mspaint"/>
</customer>
<customer ID="c0500208" >
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4" procedure="mspaint"/>
</customer>
</customers>
4.4.1 实体的概念
实体是包括了文档片断的虚拟存储单元,可用来存储XML声明、DTD、其他情势的文本及2进制数据等。简单来说就是1段代码或数据的代称,这个代称即为实体的名字。当需要在文档中援用某段代码或数据时,可以援用与这段代码或数据相对应的实体名称来代替实体的具体内容。具有正确性检查功能的XML处理器在提交文档给终究利用程序之前或在显示文档之前,将先把所有不同的实体援用替换为与其对应的具体内容,从而构成1个结构完全的文档。
4.4.2 实体的分类
依照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等2进制文件。
依照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体的内容是在文档内部设定的;而外部实体则是1个外部独立的物理存储对象,如某个外部文件。
依照使用的范围来分类,实体可分为1般实体与参数实体两类。1般实体都用来构成文档的具体内容,可出现在XML文档中,也可出现在DTD中;而参数实体只能出现在DTD中,不能出现在XML文档中。
1. 内部1般实体
内部1般实体就是在文档实体内部定义和使用的实体,其内容通常是1段文本字符。这类实体要在DTD中通过DTD语句的定义,可以在XML文档中使用,也可在DTD中使用。其定义的语法格式以下:
<!ENTITY Eentity_name "Replacement" >
其中,<!ENTITY>
为关键字,Eentity_name为实体名称,Replacement为实体所代替的文本内容。援用内部1般实体的方法以下:
&Eentity_name;
【例4.13】 内部1般实体的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title, author, publish, price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher, ISBN, pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY thepublisher "高等教育出版社">
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher> &thepublisher; </publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
其显示结果与4.2节的图4.2相同。
当内部1般实体在DTD中援用时,有以下几方面需注意。
(1) 不能在元素及属性的声明中援用内部1般实体,以下面的语句即为非法的:
<!ENTITY pcd (#PCDATA)>
<!ELEMENT title &pcd;>
(2) 在语句中不能出现循环,以下面的语句即为非法的:
<!ENTITY thepub "北京大学&pub;">
<!ENTITY pub "出版社&thepub;">
<!ENTITY Eentity_name "URL" >
其中,URL为援用的外部实体的URL地址。援用外部1般实体也与援用内部1般实体的方法1样:
&Eentity_name;
假设有1个XML文档code4_14out.xml以下:
<?xml version="1.0" encoding="gb2312" ?>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
可以通过下面的例子把它作为外部实体来援用。
【例4.14】 外部1般实体的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY pub SYSTEM "code4_14out.xml">
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
&pub;
<price>19.7</price>
</bookinfo>
其显示结果仍与4.2节的图4.2相同。
在援用外部1般实体时,有以下几方面需注意。
(1) 由于在1个文档中需援用某些外部文件,所以该文档声明中的standalone属性不再是默许值yes,而应当为no。
(2) 作为外部1般实体的文档,若使用的是XML的默许字符集即UTF⑻或UNICODE,则可以在文档头部不进行XML声明,否则,必须有XML声明,且声明时,1定要说明ecoding属性。
3. 内部参数实体
内部参数实体是指在独立的外部DTD文档的内部定义和使用的实体,其内容为仅能为DTD而非XML文档内容的书写文本。这里提到参数实体与前面所讲的1般实体是有区分的:
(1) 在援用情势上,1般实体的援用为“&Eentity_name;”,而参数实体的援用则为“%Eentity_name;”
(2) 在援用范围上,1般实体可在XML文档中援用,也可在DTD中援用,而参数实体只可在DTD中援用。
定义内部参数实体的语法格式以下:
<!ENTITY % Eentity_name "Replacement" >
【例4.15】 内部参数实体的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub "(publisher,ISBN,pubdate)">
<!ELEMENT publish %pub;>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY % Eentity_name "URL" >
【例4.16】 外部参数实体的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo SYSTEM "code4_16_1.dtd">
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
程序code4_16_1.dtd为
<?xml version="1.0" encoding="gb2312"?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub SYSTEM "code4_16_2.dtd">
%pub;
<!ELEMENT price (#PCDATA)>
程序code4_16_2.dtd为
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
4.5.1 内部DTD
内部DTD的定义语句和XML文档在同1个文档中,且通常放置在XML文档的头部。在定义内部DTD时,定义内部DTD的语句要全部放置在文档类型声明中,其语法格式:
<!DOCTYPE Root_Element_Name [
…
]>
其中,为关键字,Root_Element_Name为根元素名,[…]部份则为内部DTD定义语句。如例4.1,即是1个包括内部DTD的XML文档。
4.5.2 外部DTD
外部DTD就是有关文档定义的语句都被独立出来放在1个外部文件中,对其进行独立的管理。跟据其内容的性质,可分为两种,1种是私有文件,指未公然的、属于某组织或个人私有的DTD文件;另外一种是公然文件,是指由国际标准组织如ISO等或可发布技术建议的组织如W3C等,为某1领域所制定的公然的标准DTD。
援用私有DTD文件的语法格式:
<!DOCTYPE Root_Element_name SYSTEM "URL">
其中,URL为外部DTD文件的相对路径或绝对路径,该语句必须置于XML文档的头部,且在XML文档处理指令中要将standalone属性值设定为no。如例4.14。
援用公然DTD文件的语法格式:
<!DOCTYPE Root_Element_name PUBLIC "Public_Dtd_name" " Public_Dtd_URL">
其中,PUBLIC为公然DTD文件的关键字。Public_Dtd_name为公然DTD文件的文件名,这个文件名由4个部份组成:第1部份为DTD的发布者,若是ISO发布,则第1部份为ISO;若是非ISO的标准组织发布,则为“+”;若是非标准组织发布,则为“-”。第2部份为所有者的名字。第3部份为表明这个DTD文件的主要内容或种别的扼要文本。第4部份为所使用的语言,该语言标志必须是ISO639所定义过的标准标志。这4部份之间用“//”隔开。Public_Dtd_URL为公然DTD文件的相对路径或绝对路径。
4.5.3 混合DTD
所谓混合DTD,即为内部DTD与外部DTD混合使用。在DTD使用的实际情况中, 很少使用完全标准的DTD,常常是公司先为所有的开发小组提供1分公共的DTD作为外部DTD,然后各个成员在实际的使用进程中再进行扩大定义,这时候的扩大定义常常是使用内部DTD来实现的。
【例4.17】 混合DTD的使用,代码以下所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo SYSTEM "code4_16_2.dtd"[
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768⑻</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>