??xml version="1.0" encoding="utf-8" standalone="yes"?>
本章大概内容Q?br />
1、ؓ什么需要DTD
2、XML文档如何使用DTD
1Q内部定义DTD
2Q关联外部DTD
3、DTD的结?br />
1Q元素类型声?br />
2Q属性列表声?br />
3Q实体声?br />
4Q记号声?br />
对于一个格式良好的XML文档Q我们只能保证这个文档的格式W合XML规范Q但是元素与元素的关p,元素与属性的关系Q属性的取|我们无法保证了。对于一个格式良好的文档Q如果只是在有限的应用中使用Q或者是用于存储和传输,那么它也能能够很好的满我们的应用,但是如果要其它的用户了解你所写的XML文档Q或者与其它应用q行数据的交换,那么有必要提供一U机Ӟ来保证我们写的XML文档和别人所写的XML文档在结构上是相同的Q元素与元素之间的关pL正确的,属性的取g是符合要求的Q那么这U机制在XML规范中已lؓ我们提供了,那就是前一章中介绍q的文档cd声明中提到的DTD?br />
DTDQDocument Type DefinitionQ,文档cd定义?br />
在XML标准中,描述了如何创建DTDQ以及如何将它与Ҏ它的规范所~写的XML文档相关联,q且q定义了XML处理器应该如何对DTDq行处理。有了DTD可以检XML文档的结构是否正?br />
DTD为XML文档的编写者与处理者提供了共同遵@的原则,使得与文档相关的各种工作有了l一的标准?br />
如何在XML文档中引入DTD
通过在XML文档中包含文档类型声明,来徏立当前文档和DTD的关联。当q行有效性验证的XML处理器读到该声明Ӟ它获取DTDQƈҎ其中定义的规则对文档q行验。文档类型声明必M于XML声明之后Q且在根元素Q文档元素)之前。不q,在XML声明和文档类型声明之间可以插入注释和处理指o?br />
我们可以直接在XML文档中定义DTDQ也可以通过URI引用外部的DTD文gQ或者同旉用这两种方式?br />
上一章中Q已l学习过如何通过包含文档cd声明来徏立与DTD的关联。现在来分析一下这两种包含方式?br />
在XML文档内部l出DTD的方式:
<!DOCTYPE OrganizationChart [
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
]>
<OrganizationChart>
<!--OrganizationChart是该XML文档的document element-->
<Name>TooneQINC.</Name>
<Office>zhuhai</Office>
<!--因ؓDTD中定义了NameQOffice两个元素的顺序,Office元素不能攑֜Name元素的前面,否则不是有效的XML文档-->
</OrganizationChart>
文档cd声明?lt;!开始,后面紧跟一个关键字DOCTYPEQ然后是文档根元素的名字Q接下来是标记声明块Q标记声明块攑֜中括号[]之间Q由一个或者多个标记声明构成,最后由>l束?br />
在DTD中,所有的关键字都是大写的。不q,在DTD中定义的元素和属性的大小写是可以L制定的,但是要注意,因ؓXML文档是大写相关的,所以一旦给一个元素命名,那么在整个文档中要用相同的大小写。例如,organizationchart和OrganizationChart是不同的两个元素名?br />
在XML文档中定义DTDQ比较直观,修改也比较方便,而且不用担心XML处理器找不到DTDQ但是它也有一些缺点:
1、在文档中定义DTD会导致文档本w的长度增加Q在传输数据Ӟ即不需要验证文档的有效性,q些声明也要一起传输?br />
2、如果多个XML文档要共用同一个DTDQ我们就需要在每一个文档中加入DTD?br />
引进外部DTD方式Q?/strong>
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
<Name>TooneQINC.</Name>
<Office>zhuhai</Office>
</OrganizationChart>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
在文档类型声明时Q用间质SYSTEM或PUBLIC来指出外部DTD文g的位|,使用SYSTEM关键字的声明语法如下Q?br />
<!DOCTYPE 根元素的名字 SYSTEM "外部DTD文g的URI">
SYSTEM关键字表C文档用的是私有的DTD文gQ?#8220;外部DTD文g的URI”可以是相对URI或者绝对URI。例如上面的例子使用的就是相对URIQ?br />
使用PUBLIC关键字的声明语法如下Q?br />
<!DOCTYPE 根元素的名字 PUBLIC "DTD的名? "外部DTD文g的URI">
PUBLIC关键字用于声明公qDTDQƈ且这个DTDq有一个名Uͼ"DTD的名U?也称为公共标识符(public identifier)。这个DTD可以存放在某个公q地方QXML处理E序会根据名U按照某U方式去索DTDQ如果XML处理器不能根据名U检索到DTDQ就会?外部DTD文g的URI"来查找该DTD。例如Java web开发的web.xml中的DTD声明Q版本不同会E有不同Q我们只x它的l构Q:
'http://java.sun.com/dtd/web-app_2_3.dtd'>
DTD名称与XML名称略有不同Q他们只能包含ASCII字母和数字符受空根{回车符、换行符和一些标点符P-'()+,/:=?;!#@*$_%.
公共DTD名称要遵守一些约定。如果一DTD是ISO标准Q它的名U要以字W串"ISO"开始。如果是一个非ISO的标准组l批准的DTDQ它的名字以加号Q+Q开始。如果不是标准组l批准的DTDQ它的名UCq字W(Q)开始。这些开始字W或字符串后接双斜杠Q?/Q和DTD所有者的名字Q比如上面例子的Sun MicrosystemsQInc.Q,之后是另一个双斜杠和DTD描述的文档类型,接着优势一个双斜杠后接ISO 639语言标识W,如EN表示pQZH表示中文。例如:
在上一章我们提刎ͼ如果我们的文档不依赖于外部文档,在XML声明中,可以通过standalone="yes"来声明这个文档是独立的文档。如果文档依赖于外部文档Q可以通过standalone="no"来声明。当我们使用外部DTD文gӞ需要将属性standalone的D|ؓ"no"?br />
在实际应用中Q很用standalone属性,它的主要用途是作ؓXML处理器行业其他应用程序的标志Q表C是否需要获取外部内宏V如果文档依赖于外部文档Q即使我们不使用standalone属?XML处理器也能很好地q行处理?br />
DTD的结构:
DTD的结构一般由以下四种声明构成Q?br />
1、元素类型声?br />
2、属性列表声?br />
3、实体声?br />
4、记号声?br />
一个典型的文档cd定义文g会吧所要创建的XML文档的元素结构、属性类型、实体引用等预先q行定义?br />
下面分别介绍q四U声明?br />
1、元素类型声明:
一个DTD不仅要告诉XML处理器它所对应的文档根元素Q而且q要告知处理器,文档的内容和l构Q描q清楚文档结构中的每一个细节?br />
元素cd声明不但说明了每一个文档中可能存在的元素,l出了元素的名称Q而且l出了元素的具体cd?br />
一个XML元素可以为空Q也可以只包含字W数据,q可以有若干个子元素Q而这些子元素同时又可以拥有它们的子元素?br />
元素cd声明采用如下的语法格式:
<!ELEMENT 元素名称 元素内容说明>
元素内容说明可以指明五种可能的元素内容Ş式:QPCDATA、子元素、合内宏VEMPTY和ANY?br />
下面详细说明每一U元素内容说明?br />
#PCDATA:
关键?PCDATA说明元素包含字符数据?br />
<!DOCTYPE OrganizationChart [
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
]>
<OrganizationChart>
<Name>TooneQINC.</Name>
<Office>ZhuHai</Office>
</OrganizationChart>
子元素:
当一个元素只包含子元素,而没有字W数据时Q则U此元素cdh元素型内容(element contentQ?br />
在该cd的元素声明时Q通过内容模型来指定在其内容上的约束。内Ҏ型是军_子元素类型和子元素出现顺序的一U简单语法?br />
一D|Jenny在酒吧裸体抱着吉他弹唱的:
How many roads must a man walk down 一个h要走多少?br />
Before you can call him a man? 才能被称为男子汉Q?br />
Yes, and how many seas must the white dove sail 一条船要出几回?..
Before she sleeps in the sand? 才能w在沙W上?
Yes, and how many times 而到底需要多次...
Must the cannon balls fly 炮火的蘪?br />
Before they're forever banned? 才能l束战争Q?br />
The answer, my friend 那答案,我的朋友...
Is blowin'in the wind ...在风中飘?br />
Is blowin'in the wind ...在风中飘?br />
另一D|Forrest Gump跑步跑遍国时的背景音乐Q?br />
Lookin'out at the road rushin'under my wheels 看着路在车轮下g?br />
Lookin'back at the years gone by 看着一q年时光飞?br />
Like so many summer fields 像一片片夏日农田
In '65, I was 17 六五q那时我十七?br />
And runnin'up one on one 我在一M停地奔跑
I don't know where I'm runnin'now 我不知道跑到了何?br />
I'm just runnin'on 我只是在不停地奔?br />
Runnin'on 奔跑
Runnin'on Empty 无缘无故地奔?br />
Runnin'on 奔跑
Runnin'dry 直到_力尽
一个h要走多少路才能被UCؓ男子汉,那答案,我的朋友Q它在风中飘Q看着一q年时光飞逝,我只是一M停地奔跑Q我不知道跑C何处Q我无缘无故地奔跑,直到_力尽?br />
推荐一个XML~辑工具Q强大的XMLSpyQ我用的?008版?/span>
XML文档的结构可以从物理和逻辑两方面来看?br />
一、从物理上而言Q文档由UCؓ实体Q?span style="color: #999999;">entitiesQ的存储单元l成Q实体都是具有内容ƈ且都通过实体的名字进行标识(文档实体和外部DTD子集除外Q。实体可以是一D|本,一个文Ӟ一个数据库记录或者其他包含数据的目Q一个实体可以引用其它的实体Q从而将它们包含在文档中。文档开始于“根(rootQ?#8221;或者文档实体(document entityQ。格式良好的XML文档形成了一U层ơ树l构Q这个树l构的树根就是文档实体,与其它实体不同,文档实体没有名字Q只是用于表C文档树的根。XML文档的根元素被称位文档元素(document elementQ,它和在其外部出现的处理指令,注释{作为文档实体的子节点,而根元素本n和其内部的子元素也是一|?br />
('M'|'m'
)('L'|'l'
))的字W串开头的名字Q被保留用于XML规范的当前版本或者后l版本的标准化。此外,在给元素命名Ӟq要遵@下列规范Q?br />
1、名字只能以字母、下划线Q_Q或者冒P:Q开_
实体可以包含已分析(parsedQ的或未分析的(unparsedQ数据。已分析的数据由字符l成Q其中一些字W组成字W数据,另一些字W组成标记。已分析的实体(parsed entityQ内容被成ؓ它的代替文本Q这个文本被看称是文档整体的一部分Q在XML处理器分析XML文档Ӟ凡是文档中出现引用已分析实体的地方,都将被该实体的内Ҏ替换。未分析的实体(unparsed entityQ是一U资源,它的内容可以是也可以不是文本Qƈ且,如果是文本的话,可以不是XML文本Q每一个未分析的实体有一个相兌的用名字标识的记PnotationQ。除了要求XML处理器能向应用程序提供可用的实体和记L标志W之外,XMLҎ分析的的实体内容不做M限制。已分析的实体以实体引用的方式通过名字来调用,未分析的实体通过ENTITY或ENTITIES属性中l出的名字来调用?br />
二、逻辑上而言Q文档由声明Q元素,注释Q字W引用和处理指ol成Q在文档中,所有这些都是通过昑ּ的标讎ͼmarkupQ来指明的。XML标记QmarkupQ包括开始标{(tagQ、结束标{、空元素标签、实体引用、字W引用、注释、CDATAD定界符、文档类型声明、处理指令、XML声明、文本声明以及Q何在文档实体层的空白(卻I在文档元素之外,且不在Q何其它的标记内部Q?br />
其它所有非标记的文本组成文档的字符数据?br />
XML文档在逻辑上主要由以下五个部分l成Q?br />
1、XML声明
2、文档类型声?br />
3、元?br />
4、注?br />
5、处理指?br />
下面具体介绍XML文档逻辑上的五个部分?br />
1、XML声明
XML文档L以一个XML声明开始的Q其格式如下
<?xml 版本信息 [~码信息] [文档独立性信息]?>
其中Q编码信息和文档独立性信息可以不写,而用默认倹{?br />
需要注意的是,XML声明L在XML文档的最前面Q其前面不能出现M字符?br />
下面是几个例子:
<!--版本信息声明-->
<!--~码信息声明.默认值是"UTF-8"-->
<!--文档独立性信息声?如果文档依赖于外部文档,则需要将standalone属性设|ؓ"no"-->
2、文档类型声?/strong>
DTDQDocument Type DefinitionQ,文档cd定义?br />
首先提一个问题,如果你的一个XML文档l别Z用,别h怎么才能正确地定义XML文档中的元素Q属性呢Q就好像我们用StrutsӞ我们需要配|struts-config.xml,但是怎么保证我们的配|是正确的?{案是用DTD来验证?br />
一个遵循XML语法规则Qƈ遵守相应DTD文gU束的XML文档UCؓ有效的XML文档?br />
XML从SGMLl承了用于定义语法规则的DTD机制QDTD文g本n是不需要遵循XML规则的。大部分的XML应用都是使用DTD来定义的Q还有一部分是用XML Schema来定义的QXML Schema在其专题中学习)。HTML有一个标准的DTD文gQ所以其l织l构和所有的标签都是固定的,DTD文g本n也是一个文本文Ӟ通常?.DTD"为其扩展名?br />
文档cd声明的作用就是指出XML文档所用的DTDQ文档类型声明有两种形式?br />
一U是在XML文档中给出DTDQ如下:
<!DOCTYPE OrganizationChart [
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
]>
<OrganizationChart>
<!--OrganizationChart是该XML文档的document element-->
<Name>TooneQINC.</Name>
<Office>zhuhai</Office>
<!--因ؓDTD中定义了NameQOffice两个元素的顺序,Office元素不能攑֜Name元素的前面,否则不是有效的XML文档-->
</OrganizationChart>
另一U是在一个外部文件定义的DTD文gQ如下:
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
<Name>TooneQINC.</Name>
<Office>zhuhai</Office>
</OrganizationChart>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
3、元?br />
在XML中,元素由开始标{、元素内容和l束标签构成Q对于空元素Q由I元素标{构成?br />
每一个元素都有一个用名字标识的类型,同时它可以由一个属性说明集Q每一个属性说明有一个名字和一个倹{?br />
在给元素命名的时候要注意Q以"xml"或其他Q何匹?('X'|'x')
2、名字中可以包含字母、数字、下划线以及其他在XML标准中允许的字符Q?br />
3、名字中不能包含I格Q?br />
4、名字中可能不要用冒P:Q,因ؓ冒号在名字空间中被用于分隔名字空间前~和本地部分?br />
元素的四UŞ式:
1、空元素
2、带有属性的I元?br />
3、带有内容的元素
4、带有内容和属性的元素
在一个元素的内容中,字符数据可以是不包含M标记的v始定界符和CDATAD늚定界W的L字符Ԍ也就是会所在元素的内容中,字符数据不能有和P&Q和于P
<Q,也不能有字符?]]>"。那么如果我们要用这些字W的话,必须用他们对应的字符引用和实体引用来表示Q见下表Q?br />
元素内容的字W引用和实体引用
字符
字符引用
Q十q制代码Q?br />
字符引用
Q十六进制代码)
预定义实体引?nbsp;
<
<
<
<
>
>
>
>
"
"
'
'
&
&
CDATAD中包含的都是纯字符数据Q在字符数据可以出现的Q何地斚w可以使用CDATADc?br />
CDATAD主要用于需要将整个文本解释为字W数据而不是标记的情况下。CDATAD中的内容不被XML处理器分析,所以可以在其中包含L的字W?br />
4、注?br />
注释用于Ҏ档中的内容vC个说明作用?br />
在XML文档中,注释可以出现在文档中其它表ijizhiwai的Q何闻之,另外Q它们还可以在h当类型声明中语法QgrammarQ允许的地方出现?br />
XML的注释和HTML的注释类|都是?lt;!--开始,?->l束。位?lt;!--?->之间的数据将被XML处理器忽略?br />
使用XML注释需要注意一下五点:
1、注释不能出现在XML声明之前QXML声明必须是文档最前面的部分。下面的情况是不允许的:
<?xml version="1.0"?>
2、注释不能出现在标记中,下面的例子是非法的:
3、注释可以包围和隐藏标记Q但是要注意Q在注释掉标C后,要保持文档的完整l构?br />
4、字W串"--"Q双q字W)不能出现在注释中?br />
5、处理指?/strong>
处理指oQProcessing InstructionsQ允许文档中包含由应用程序来处理的指令。在XML文档中,有可能会包含一些非XML格式的数据,q些数据XML处理器无法处理,我们可以通过处理指o来通知其它应用E序来处理这些数据?br />
处理指o的语法和XML声明cMQ以<?开始, ?>l束。一个常见的使用样式表单的处理指令如下所C:
在开始标?lt;?后的W一个字W?xml-stylesheet"叫做处理指o的目标,它必L识要用到的应用程序,要注意的是对于其它的非W3C定义的处理指令不能以字符?XML"?xml"开_其余的部分是传递给应用E序的字W数据。应用程序从处理指o中取得目标和数据Q执行要求的动作?br />
处理指o的目标可以是要用的E序的名字,或者是一个类gxml-stylesheetq样的很多程序可以识别的通用标识W。不同的应用E序支持不同的处理指令,对于不认识的处理指oQ大多数应用E序采取忽略的方式进行处理?br />
xml-stylesheet处理指oL攑֜XML声明之后Q第一个元素之前。其它的处理指o可以攑֜除了标记的内部和XML声明之前的Q何位|?br />
要注意,虽然XML声明和处理指令的语法形式怼Q但XML声明q不是处理指令,XML处理E序对XML声明和处理指令采取的是不同的处理方式?br />
本章学习到此为止Q下一章学习如何编写DTD?br />
XML的全U是Extensible Markup LanguageQ意思是可扩展的标识语言Q是SGMLQ?span style="color: #999999;">Standard Generalized Markup LanguageQ的一个子集?998q?月,W3Cl织发布了XML1.0标准Q其目的是ؓ了在Web上能以现有的文本标识语aQHTMLQ的使用提供Q接收和处理通用的SGML。XML以一U开攄Q自我描q的方式定义了数据结构,在描q数据内容的同事能突出对l构的描qͼ从而体现出数据与数据之间的关系。XML的最新版本是1.1Q于2004q??日发布。目前大多数的应用还是基于XML1.0的推荐标准?.0版本的规范在下面|址中定义:
http://www.w3.org/TR/2004/REC-xml-20040204/
XML不是QXQHTML的扩展,两者之所以看h很像Q是因ؓ它们都是SGML发展而来的标识语aQ语法很怼Q标识的使用也很怼。HTML只是SGML的一个子应用Q它的DTDQ?span style="color: #999999;">Document Type DefinitionQ被固定下来Q所以不能用来定义新的应用。而XML不同Q我们可以根据自q需要,随意定义我们自己的DTDQ所以,利用XMLQ可以定义出新的应用Q比如,RDFQ?span style="color: #999999;">Resource Description FrameworkQ资源描q框Ӟblog中经常看见的RSS1.0是RDF Site SummaryQRDF|站摘要,关于RSSQ我在潜心学习RSS中去认识?/span>Q?CDFQ?span style="color: #999999;">Channel Definition FormatQ通道定义格式Q微软在IE4.0中引入的一个新功能。基于CDFQ网站可以通过zd通道数据聚合到讄为活动桌面的用户桌面?/span>Q?br />
XML规范的制定者之一Tim Bray_XML的设计出发点是取SGML的优点,去除复杂的部分,使其保持dyQ可以在Web上工作?br />
XML的应用非常广泛,计算机和|络的世界里Q处处活跃着它矫健轻快的w媄Q或为配|文Ӟ或ؓ数据存储Q或为数据传输用的格式。XML已经成ؓ事实上的数据交换格式的标准,使用XMLQ意味着所有设备,比如手机QPDAQ信息家늭{,都可以轻杄dQ解析你的数据?br />
XML很重要的两个Ҏ:
一QXML文档仅仅描述数据Q它不关心数据是如何表现外观的,比如字体大小Q颜Ԍ间距之类的,所以它能将数据和数据的表现方式完全的分dQ这个特性很重要QHTML׃万做不到q种完全的分,所以W3Cl织不得不推Z个XHTMLQ作为HTML向XMLq度的物?br />
二:XMLҎ档的格式要求非常严格Q符合标准的XML文档是格式良好的XML文档QWell-Formed XML DocumentsQ?/span>q是使得XML文档能被普遍认可的一个特炏V严格的文档格式Q减M解析的复杂性。相Ҏ_HTML的文档格式就非常松散Q解析v来就比较复杂Q也造成了浏览器兼容的问题。XML文档格式的要求有下面几点Q?br />
1、所有的标签都必d闭,开始标{有对应的结束标{,I标{ֿ被关闭?br />
2、所有的标签都区分大写
3、所有的标签都必d理嵌?br />
4、所有的标签的属性值必ȝ收引P""Q或单引P''Q括h
5、XML文档有且只能有一个根元素
6、(q有其他的嘛Q)
本章到此l束Q重Ҏ握XML与HTML的异同点QXML的两个特性?br />
下一章学习XML的结构?br />