DTD教程.docx
- 文档编号:12804499
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:18
- 大小:21.93KB
DTD教程.docx
《DTD教程.docx》由会员分享,可在线阅读,更多相关《DTD教程.docx(18页珍藏版)》请在冰豆网上搜索。
DTD教程
DTD教程
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。
开始学习DTD!
内容目录
DTD简介
对XMLDTD的简介,以及使用它的原因。
DTD-XML构建模块
可以在DTD中定义的XML构建模块。
DTD元素
如何使用DTD定义XML文档的合法元素。
DTD属性
如何使用DTD定义XML元素的合法属性。
DTD实体
如何使用DTD定义XML实体。
DTD验证
如何在载入XML文档时,检验DTD错误。
DTD实例
一些真实的DTD案例。
DTD总结
本文包括在本教程所学内容的一个总结,以及我们向您推荐的下一步应该学习的内容。
1DTD简介
文档类型定义(DTD)可定义合法的XML文档构建模块。
它使用一系列合法的元素来定义文档的结构。
DTD可被成行地声明于XML文档中,也可作为一个外部引用。
1.1内部的DOCTYPE声明
假如DTD被包含在您的XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:
DOCTYPE根元素[元素声明]>
带有DTD的XML文档实例(请在IE5以及更高的版本打开,并选择查看源代码):
xmlversion="1.0"?
>
DOCTYPEnote[
ELEMENTnote(to,from,heading,body)>
ELEMENTto(#PCDATA)>
ELEMENTfrom(#PCDATA)>
ELEMENTheading(#PCDATA)>
ELEMENTbody(#PCDATA)>
]>
在您的浏览器中打开此XML文件,并选择“查看源代码”命令。
以上DTD解释如下:
!
DOCTYPEnote(第二行)定义此文档是note类型的文档。
!
ELEMENTnote(第三行)定义note元素有四个元素:
"to、from、heading,、body"
!
ELEMENTto(第四行)定义to元素为"#PCDATA"类型
!
ELEMENTfrom(第五行)定义frome元素为"#PCDATA"类型
!
ELEMENTheading(第六行)定义heading元素为"#PCDATA"类型
!
ELEMENTbody(第七行)定义body元素为"#PCDATA"类型
1.2外部文档声明
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:
DOCTYPE根元素SYSTEM"文件名">
这个XML文档和上面的XML文档相同,但是拥有一个外部的DTD:
(在IE5中打开,并选择“查看源代码”命令。
)
xmlversion="1.0"?
>
DOCTYPEnoteSYSTEM"note.dtd">
这是包含DTD的"note.dtd"文件:
ELEMENTnote(to,from,heading,body)>
ELEMENTto(#PCDATA)>
ELEMENTfrom(#PCDATA)>
ELEMENTheading(#PCDATA)>
ELEMENTbody(#PCDATA)>
1.3为什么使用DTD?
通过DTD,您的每一个XML文件均可携带一个有关其自身格式的描述。
通过DTD,独立的团体可一致地使用某个标准的DTD来交换数据。
而您的应用程序也可使用某个标准的DTD来验证从外部接收到的数据。
您还可以使用DTD来验证您自身的数据。
2DTDXML构建模块
XML以及HTML文档的主要构建模块是类似
....这样的标签。2.1XML文档构建模块
所有的XML文档(以及HTML文档)均由以下简单的构建模块构成:
∙元素
∙属性
∙实体
∙PCDATA
∙CDATA
下面是每个构建模块的简要描述。
2.2元素
元素是XML以及HTML文档的主要构建模块。
HTML元素的例子是"body"和"table"。
XML元素的例子是"note"和"message"。
元素可包含文本、其他元素或者是空的。
空的HTML元素的例子是"hr"、"br"以及"img"。
实例:
bodytextinbetween2.3属性
属性可提供有关元素的额外信息。
属性总是被置于某元素的开始标签中。
属性总是以名称/值的形式成对出现的。
下面的"img"元素拥有关于源文件的额外信息:
元素的名称是"img"。
属性的名称是"src"。
属性的值是"computer.gif"。
由于元素本身为空,它被一个"/"关闭。
2.4实体
实体是用来定义普通文本的变量。
实体引用是对实体的引用。
大多数同学都了解这个HTML实体引用:
" "。
这个“无折行空格”实体在HTML中被用于在某个文档中插入一个额外的空格。
当文档被XML解析器解析时,实体就会被展开。
下面的实体在XML中被预定义:
实体引用
字符
<
<
>
>
&
&
"
"
'
'
2.5PCDATA
PCDATA的意思是被解析的字符数据(parsedcharacterdata)。
可把字符数据想象为XML元素的开始标签与结束标签之间的文本。
PCDATA是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&、<或者>字符;需要使用&、<以及>实体来分别替换它们。
2.6CDATA
CDATA的意思是字符数据(characterdata)。
CDATA是不会被解析器解析的文本。
在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
3DTD元素
在一个DTD中,元素通过元素声明来进行声明。
3.1声明一个元素
在DTD中,XML元素通过元素声明来进行声明。
元素声明使用下面的语法:
ELEMENT元素名称类别>
或者
ELEMENT元素名称(元素内容)>
3.2空元素
空元素通过类别关键词EMPTY进行声明:
ELEMENT元素名称EMPTY>
例子:
ELEMENTbrEMPTY>
XML例子:
3.3只有PCDATA的元素
只有PCDATA的元素通过圆括号中的#PCDATA进行声明:
ELEMENT元素名称(#PCDATA)>
例子:
ELEMENTfrom(#PCDATA)>
3.4带有任何内容的元素
通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:
ELEMENT元素名称ANY>
例子:
ELEMENTnoteANY>
3.5带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
ELEMENT元素名称(子元素名称1)>
或者
ELEMENT元素名称(子元素名称1,子元素名称2,.....)>
例子:
ELEMENTnote(to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。
在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
"note"元素的完整声明是:
ELEMENTnote(to,from,heading,body)>
ELEMENTto(#PCDATA)>
ELEMENTfrom(#PCDATA)>
ELEMENTheading(#PCDATA)>
ELEMENTbody(#PCDATA)>
3.6声明只出现一次的元素
ELEMENT元素名称(子元素名称)>
例子:
ELEMENTnote(message)>
上面的例子声明了:
message子元素必须出现一次,并且必须只在"note"元素中出现一次。
3.7声明最少出现一次的元素
ELEMENT元素名称(子元素名称+)>
例子:
ELEMENTnote(message+)>
上面的例子中的加号声明了:
message子元素必须在"note"元素内出现至少一次。
3.8声明出现零次或多次的元素
ELEMENT元素名称(子元素名称*)>
例子:
ELEMENTnote(message*)>
上面的例子中的星号声明了:
子元素message可在"note"元素内出现零次或多次。
3.9声明出现零次或一次的元素
ELEMENT元素名称(子元素名称?
)>
例子:
ELEMENTnote(message?
)>
上面的例子中的问号声明了:
子元素message可在"note"元素内出现零次或一次。
3.10声明“非.../既...”类型的内容
例子:
ELEMENTnote(to,from,header,(message|body))>
上面的例子声明了:
"note"元素必须包含"to"元素、"from"元素、"header"元素,以及非"message"元素既"body"元素。
3.11声明混合型的内容
例子:
ELEMENTnote(#PCDATA|to|from|header|message)*>
上面的例子声明了:
"note"元素可包含出现零次或多次的PCDATA、"to"、"from"、"header"或者"message"。
4DTD属性
在DTD中,属性通过ATTLIST声明来进行声明。
4.1声明属性
属性声明使用下列语法:
ATTLIST元素名称属性名称属性类型默认值>
DTD实例:
ATTLISTpaymenttypeCDATA"check">
XML实例:
以下是属性类型的选项:
类型
描述
CDATA
值为字符数据(characterdata)
(en1|en2|..)
此值是枚举列表中的一个值
ID
值为唯一的id
IDREF
值为另外一个元素的id
IDREFS
值为其他id的列表
NMTOKEN
值为合法的XML名称
NMTOKENS
值为合法的XML名称的列表
ENTITY
值是一个实体
ENTITIES
值是一个实体列表
NOTATION
此值是符号的名称
xml:
值是一个预定义的XML值
默认值参数可使用下列值:
值
解释
值
属性的默认值
#REQUIRED
属性值是必需的
#IMPLIED
属性不是必需的
#FIXEDvalue
属性值是固定的
4.2规定一个默认的属性值
DTD:
ELEMENTsquareEMPTY>
ATTLISTsquarewidthCDATA"0">
合法的XML:
在上面的例子中,"square"被定义为带有CDATA类型的"width"属性的空元素。
如果宽度没有被设定,其默认值为0。
4.3#IMPLIED
语法
ATTLIST元素名称属性名称属性类型#IMPLIED>
例子
DTD:
ATTLISTcontactfaxCDATA#IMPLIED>
合法的XML:
合法的XML:
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词#IMPLIED。
4.4#REQUIRED
语法
ATTLIST元素名称属性名称属性类型#REQUIRED>
例子
DTD:
ATTLISTpersonnumberCDATA#REQUIRED>
合法的XML:
非法的XML:
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词#REQUIRED。
4.5#FIXED
语法
ATTLIST元素名称属性名称属性类型#FIXED"value">
例子
DTD:
ATTLISTsendercompanyCDATA#FIXED"Microsoft">
合法的XML:
非法的XML:
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用#FIXED关键词。
如果作者使用了不同的值,XML解析器会返回错误。
4.6列举属性值
语法:
ATTLIST元素名称属性名称(en1|en2|..)默认值>
DTD例子:
ATTLISTpaymenttype(check|cash)"cash">
XML例子:
或者
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。
5DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
5.1一个内部实体声明
语法:
ENTITY实体名称"实体的值">
例子:
DTD例子:
ENTITYwriter"BillGates">
ENTITYcopyright"CopyrightW3S">
XML例子:
注释:
一个实体由三部分构成:
一个和号(&),一个实体名称,以及一个分号(;)。
5.2一个外部实体声明
语法:
ENTITY实体名称SYSTEM"URI/URL">
例子:
DTD例子:
ENTITYwriterSYSTEM"
ENTITYcopyrightSYSTEM"
XML例子:
6DTD验证
InternetExplorer5.0可根据某个DTD来验证您的XML。
6.1通过XML解析器进行验证
当您试图打开某个XML文档时,XML解析器有可能会产生错误。
通过访问parseError对象,就可以取回引起错误的确切代码、文本甚至所在的行。
注释:
load()方法用于文件,而loadXML()方法用于字符串。
varxmlDoc=newActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="true"
xmlDoc.load("note_dtd_error.xml")
document.write("
ErrorCode:
")
document.write(xmlDoc.parseError.errorCode)
document.write("
ErrorReason:
")
document.write(xmlDoc.parseError.reason)
document.write("
ErrorLine:
")
document.write(xmlDoc.parseError.line)
TryitYourself或者仅仅看一下这个XML文件。
6.2关闭验证
通过把XML解析器的validateOnParse设置为"false",就可以关闭验证。
varxmlDoc=newActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.validateOnParse="false"
xmlDoc.load("note_dtd_error.xml")
document.write("
ErrorCode:
")
document.write(xmlDoc.parseError.errorCode)
document.write("
ErrorReason:
")
document.write(xmlDoc.parseError.reason)
document.write("
ErrorLine:
")
document.write(xmlDoc.parseError.line)
TryitYourself
6.3通用的XML验证器
为了帮助您验证XML文件,我们创建了此链接,这样你就可以验证任何XML文件了。
parseError对象
您可以在我们的《XMLDOM教程》中阅读更多有关parseError对象的信息。
7DTD-来自网络的实例
7.1电视节目表DTD
由DavidMoisan创造。
拷贝自:
http:
//www.davidmoisan.org/
DOCTYPETVSCHEDULE[
ELEMENTTVSCHEDULE(CHANNEL+)>
ELEMENTCHANNEL(BANNER,DAY+)>
ELEMENTBANNER(#PCDATA)>
ELEMENTDAY(DATE,(HOLIDAY|PROGRAMSLOT+)+)>
ELEMENTHOLIDAY(#PCDATA)>
ELEMENTDATE(#PCDATA)>
ELEMENTPROGRAMSLOT(TIME,TITLE,DESCRIPTION?
)>
ELEMENTTIME(#PCDATA)>
ELEMENTTITLE(#PCDATA)>
ELEMENTDESCRIPTION(#PCDATA)>
ATTLISTTVSCHEDULENAMECDATA#REQUIRED>
ATTLISTCHANNELCHANCDATA#REQUIRED>
ATTLISTPROGRAMSLOTVTRCDATA#IMPLIED>
ATTLISTTITLERATINGCDATA#IMPLIED>
ATTLISTTITLELANGUAGECDATA#IMPLIED>
]>
7.2报纸文章DTD
拷贝自:
DOCTYPENEWSPAPER[
ELEMENTNEWSPAPER(ARTICLE+)>
ELEMENTARTICLE(HEADLINE,BYLINE,LEAD,BODY,NOTES)>
ELEMENTHEADLINE(#PCDATA)>
ELEMENTBYLINE(#PCDATA)>
ELEMENTLEAD(#PCDATA)>
ELEMENTBODY(#PCDATA)>
ELEMENTNOTES(#PCDATA)>
ATTLISTARTICLEAUTHORCDATA#REQUIRED>
ATTLISTARTICLEEDITORCDATA#IMPLIED>
ATTLISTARTICLEDATECDATA#IMPLIED>
ATTLISTARTICLEEDITIONCDATA#IMPLIED>
ENTITYNEWSPAPER"VervetLogicTimes">
ENTITYPUBLISHER"VervetLogicPress">
ENTITYCOPYRIGHT"Copyright1998VervetLogicPress">
]>
7.3产品目录DTD
拷贝自:
DOCTYPECATALOG[
ENTITYAUTHOR"JohnDoe">
ENTITYCOMPANY"JDPowerTools,Inc.">
ENTITYEMAIL"jd@jd-">
ELEMENTCATALOG(PRODUCT+)>
ELEMENTPRODUCT
(SPECIFICATIONS+,OPTIONS?
PRICE+,NOTES?
)>
ATTLISTPRODUCT
NAMECDATA#IMPLIED
CATEGORY(HandTool|Table|Shop-Professional)"HandTool"
PARTNUMCDATA#IMPLIED
PLANT(Pittsburgh|Milwaukee|Chicago)"Chicago"
INVENTORY(InStock|Backordered|Discontinued)"InStock">
ELEMENTSPECIFICATIONS(#PCDATA)>
ATTLISTSPECIFICATIONS
WEIGHTCDATA#IMPLIED
POWERCDATA#IMPLIED>
ELEMENTOPTIONS(#PCDATA)>
ATTL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DTD 教程