DTD简明教程.docx
- 文档编号:10518537
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:13
- 大小:18.77KB
DTD简明教程.docx
《DTD简明教程.docx》由会员分享,可在线阅读,更多相关《DTD简明教程.docx(13页珍藏版)》请在冰豆网上搜索。
DTD简明教程
DTD教程
DTD简介
DTD(文档类型定义)的作用是定义XML文档的合法构建模块。
它使用一系列的合法元素来定义文档结构。
内部的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)>
]>
以上DTD解释如下:
!
DOCTYPEnote(第二行)定义此文档是note类型的文档。
!
ELEMENTnote(第三行)定义note元素有四个元素:
"to、from、heading,、body"
!
ELEMENTto(第四行)定义to元素为"#PCDATA"类型
!
ELEMENTfrom(第五行)定义frome元素为"#PCDATA"类型
!
ELEMENTheading(第六行)定义heading元素为"#PCDATA"类型
!
ELEMENTbody(第七行)定义body元素为"#PCDATA"类型
外部文档声明
假如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)>
XML文档构建模块
所有的XML文档(以及HTML文档)均由以下简单的构建模块构成:
∙元素
∙属性
∙实体
∙PCDATA
∙CDATA
下面是每个构建模块的简要描述。
元素
元素是XML以及HTML文档的主要构建模块。
HTML元素的例子是"body"和"table"。
XML元素的例子是"note"和"message"。
元素可包含文本、其他元素或者是空的。
空的HTML元素的例子是"hr"、"br"以及"img"。
实例:
bodytextinbetween属性
属性可提供有关元素的额外信息。
属性总是被置于某元素的开始标签中。
属性总是以名称/值的形式成对出现的。
下面的"img"元素拥有关于源文件的额外信息:
元素的名称是"img"。
属性的名称是"src"。
属性的值是"computer.gif"。
由于元素本身为空,它被一个"/"关闭。
实体
实体是用来定义普通文本的变量。
实体引用是对实体的引用。
大多数同学都了解这个HTML实体引用:
" "。
这个“无折行空格”实体在HTML中被用于在某个文档中插入一个额外的空格。
当文档被XML解析器解析时,实体就会被展开。
下面的实体在XML中被预定义:
实体引用
字符
<
<
>
>
&
&
"
"
'
'
PCDATA
PCDATA的意思是被解析的字符数据(parsedcharacterdata)。
可把字符数据想象为XML元素的开始标签与结束标签之间的文本。
PCDATA是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何&、<或者>字符;需要使用&、<以及>实体来分别替换它们。
CDATA
CDATA的意思是字符数据(characterdata)。
CDATA是不会被解析器解析的文本。
在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
DTD-元素
声明一个元素
在DTD中,XML元素通过元素声明来进行声明。
元素声明使用下面的语法:
ELEMENT元素名称类别>
或者
ELEMENT元素名称(元素内容)>
空元素
空元素通过类别关键词EMPTY进行声明:
ELEMENT元素名称EMPTY>
例子:
ELEMENTbrEMPTY>
XML例子:
只有PCDATA的元素
只有PCDATA的元素通过圆括号中的#PCDATA进行声明:
ELEMENT元素名称(#PCDATA)>
例子:
ELEMENTfrom(#PCDATA)>
带有任何内容的元素
通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:
ELEMENT元素名称ANY>
例子:
ELEMENTnoteANY>
带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:
ELEMENT元素名称(子元素名称1)>
或者
ELEMENT元素名称(子元素名称1,子元素名称2,.....)>
例子:
ELEMENTnote(to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。
在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
"note"元素的完整声明是:
ELEMENTnote(to,from,heading,body)>
ELEMENTto(#PCDATA)>
ELEMENTfrom(#PCDATA)>
ELEMENTheading(#PCDATA)>
ELEMENTbody(#PCDATA)>
声明只出现一次的元素
ELEMENT元素名称(子元素名称)>
例子:
ELEMENTnote(message)>
上面的例子声明了:
message子元素必须出现一次,并且必须只在"note"元素中出现一次。
声明最少出现一次的元素
ELEMENT元素名称(子元素名称+)>
例子:
ELEMENTnote(message+)>
上面的例子中的加号声明了:
message子元素必须在"note"元素内出现至少一次。
声明出现零次或多次的元素
ELEMENT元素名称(子元素名称*)>
例子:
ELEMENTnote(message*)>
上面的例子中的星号声明了:
子元素message可在"note"元素内出现零次或多次。
声明出现零次或一次的元素
ELEMENT元素名称(子元素名称?
)>
例子:
ELEMENTnote(message?
)>
上面的例子中的问号声明了:
子元素message可在"note"元素内出现零次或一次。
声明“非.../既...”类型的内容
例子:
ELEMENTnote(to,from,header,(message|body))>
上面的例子声明了:
"note"元素必须包含"to"元素、"from"元素、"header"元素,以及非"message"元素既"body"元素。
声明混合型的内容
例子:
ELEMENTnote(#PCDATA|to|from|header|message)*>
上面的例子声明了:
"note"元素可包含出现零次或多次的PCDATA、"to"、"from"、"header"或者"message"。
DTD-属性
在DTD中,属性通过ATTLIST声明来进行声明。
声明属性
属性声明使用下列语法:
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
属性值是固定的
规定一个默认的属性值
DTD:
ELEMENTsquareEMPTY>
ATTLISTsquarewidthCDATA"0">
合法的XML:
在上面的例子中,"square"被定义为带有CDATA类型的"width"属性的空元素。
如果宽度没有被设定,其默认值为0。
#IMPLIED
语法
ATTLIST元素名称属性名称属性类型#IMPLIED>
例子
DTD:
ATTLISTcontactfaxCDATA#IMPLIED>
合法的XML:
合法的XML:
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词#IMPLIED。
#REQUIRED
语法
ATTLIST元素名称属性名称属性类型#REQUIRED>
例子
DTD:
ATTLISTpersonnumberCDATA#REQUIRED>
合法的XML:
非法的XML:
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词#REQUIRED。
#FIXED
语法
ATTLIST元素名称属性名称属性类型#FIXED"value">
例子
DTD:
ATTLISTsendercompanyCDATA#FIXED"Microsoft">
合法的XML:
非法的XML:
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用#FIXED关键词。
如果作者使用了不同的值,XML解析器会返回错误。
列举属性值
语法:
ATTLIST元素名称属性名称(en1|en2|..)默认值>
DTD例子:
ATTLISTpaymenttype(check|cash)"cash">
XML例子:
或者
如果您希望属性值为一系列固定的合法值之一,请使用列举属性值。
DTD-实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。
一个内部实体声明
语法:
ENTITY实体名称"实体的值">
例子:
DTD例子:
ENTITYwriter"BillGates">
ENTITYcopyright"CopyrightW3S">
XML例子:
注释:
一个实体由三部分构成:
一个和号(&),一个实体名称,以及一个分号(;)。
一个外部实体声明
语法:
ENTITY实体名称SYSTEM"URI/URL">
例子:
DTD例子:
ENTITYwriterSYSTEM"
ENTITYcopyrightSYSTEM"
XML例子:
DTD验证
InternetExplorer5.0可根据某个DTD来验证您的XML。
通过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)
关闭验证
通过把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)
通用的XML验证器
为了帮助您验证XML文件,我们创建了此链接,这样你就可以验证任何XML文件了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DTD 简明 教程