文档类型定义(DTD)简明教程

DTD 定义了文档中允许出现的元素、元素可以包含什么以及元素可以或必须有的属性。

XML 文档

<? xml version="1.0" ?>
<! DOCTYPE memories SYSTEM "memory.dtd" >
< memories >
   
< memory  tapeid ="23412" >
      
< subdate > 5/23/2001 </ subdate >
      
< donor > John Baker </ donor >
      
< subject > Fishing off Pier 60 </ subject >
   
</ memory >
   
< memory  tapeid ="23692" >
      
< subdate ? > 8/01/2001 </ subdate >
      
< donor > Elizabeth Davison </ donor >
      
< subject > Beach volleyball </ subject >
   
</ memory >
</ memories >

DTD 文档

<! ELEMENT memories (memory*)  >  
<! ELEMENT memory (subdate, donor, subject)  >
<! ATTLIST memory tapeid CDATA #REQUIRED  >
<! ELEMENT subdate (#PCDATA)  >
<! ELEMENT donor (#PCDATA)  >
<! ELEMENT subject (#PCDATA)  >

上面是以引用外部dtd文件的方式,如果是内嵌于XML文档,就:

<? xml version="1.0" ?>
<! DOCTYPE memories [
<!ELEMENT memories (memory*) 
>  
<! ELEMENT memory (subdate, donor, subject)  >
<! ATTLIST memory tapeid CDATA #REQUIRED  >
<! ELEMENT subdate (#PCDATA)  >
<! ELEMENT donor (#PCDATA)  >
<! ELEMENT subject (#PCDATA)  >
]>
< memories >
   
< memory  tapeid ="23412" >
      
< subdate > 5/23/2001 </ subdate >
      
< donor > John Baker </ donor >
      
< subject > Fishing off Pier 60 </ subject >
   
</ memory >
   
< memory  tapeid ="23692" >
      
< subdate ? > 8/01/2001 </ subdate >
      
< donor > Elizabeth Davison </ donor >
      
< subject > Beach volleyball </ subject >
   
</ memory >
</ memories >

元素定义
元素定义由 ELEMENT 关键字、元素名以及该元素可以包含的内容组成。元素的内容可以是文本、其他元素或者什么也没有(比如空元素)。例子说明:

<!ELEMENT location EMPTY >
一个元素可以定义为 EMPTY,XML就类似 <location type="vhs" />。

<!ELEMENT location (place | description) >
名为 location 的元素的数据结构可以包含一个 place 元素或者 description 元素(只能是两者选其一)。使用管道字符(|)分隔不同的选项。

<!ELEMENT location (place | description)* >
名为 location 的元素的数据结构可以包含任意个 place 元素和任意个 description 元素(顺序任意)。使用管道字符(|)分隔不同的选项。

<!ELEMENT location (place , description) >
名为 location 的元素的数据结构按顺序地包含一个 place 元素和一个 description 元素(每个元素只能出现一次)。使用逗号(,)分隔不同的选项。

<!ELEMENT location (place+ , description? , subject , donor*) >
名为 location 的元素的数据结构按顺序地包含一个或多个 place 元素,description 元素不是必须的,但如果包含的话只能出现一次,一个且只能是一个 subject 元素,任意多个(包括0个) donor 元素。
** 修饰符指定的元素可以出现 0 次或多次。
++ 修饰符指定的元素必须出现 1 次或多次。
?? 修饰符指定的元素必须出现 0 次或 1 次。

<!ELEMENT location (#PCDATA) >
名为 location 的元素只包含文本。使用 #PCDATA 关键字指定元素可以包含文本。这是已解析的字符数据(parsed character data)的简写,指代元素中任何文本,不能包含标记。XML就类似:<location>If m &lt; n</location>。

<!ELEMENT location (#PCDATA | place)* >
名为 location 的元素包含混合内容,也就是包含元素和文本。例如:
<location>My Text
<place>in City</place>
</location>

<!ELEMENT location ANY >
名为 location 的元素可包含所有可解析数据的组合,以类别关键字ANY声明的元素将包含所有可解析数据的组合。

定义属性
在DTD中,属性是通过ATTLIST声明来声明的。例子说明:
<!ATTLIST square height CDATA "12px">
square 元素有一个属性名为 height,默认值是"12px",如果square 元素不提供此属性,那解释器使用默认值"12px"。CDATA 关键字表示属性值的类型未字符串。

<!ATTLIST square height CDATA #REQUIRED>
square 元素必须包含 height 属性。

<!ATTLIST square height CDATA #IMPLIED>
square 元素可以包含也可以不含 height 属性。

<!ATTLIST square height CDATA #FIXED "10px">
square 元素可以不含 height 属性,但如果提供了 height 属性的话,必须只能是"10px"。

<!ATTLIST square height (9px|10px|11px) "10px">
square 元素可以不含 height 属性(解释器使用默认值"10px"),但如果提供了 height 属性的话,必须只能是9px、10px、11px其中之一。
(注意:后面的默认值只能是枚举中的其中之一。)

<!ATTLIST media mediaid ID #REQUIRED >
<!ATTLIST memory tapeid IDREF #REQUIRED >
使用一标识符把数据连接在一起,就像关系数据库中的主键和外键一样。这些符号向文件中增加了两个约束。首先,每个 mediaid 的值必须是唯一的;其次,每个 tapeid 的值必须和一个已有的 mediaid 匹配。每个元素最多有一个 ID 属性。

实体
实体有两种类型:参数实体一般实体。两者都像占位符或者变量那样使用,提供了一种方法设置可以在多个地方使用的一个值。 参数实体仅在 DTD 范围之内使用。它通常用于创建反复使用的定义。
比如,您可以定义 memory 元素的内容,然后在定义中引用它:
<!ENTITY % memorytype "media | subdate | donor?| subject+| location" >
<!ELEMENT memory (%memorytype;)* >
参数实体由百分号(%)、实体名和一个分号(;)组成。

一般实体也在 DTD 中定义:
<!ENTITY unknownLocation "<description>Unknown</description>" >
但只能在文档本身中使用:
...
   <memory tapeid="T1">
      <media mediaid="T1" status="vhs" />
      <subdate>2001-05-23</subdate>
      <donor>John Baker</donor>
      <subject>Fishing off Pier 60</subject>
      <location>&unknownLocation;</location>
   </memory>
...

一般实体由(&)、实体名和一个分号(;)组成。
一般实体也可以引用外部文档,如文件或 URL,因此可用于从其他来源中拉入信息,比如:
<!ENTITY copyright SYSTEM "http://www.w3schools.com/dtd/entities.dtd">

DTD 的 检验
IE浏览器内置的XML解释器可以通过DTD检验XML。代码如下:

< html >
< body >
< h3 >
This demonstrates a parser error:
</ h3 >

< script  type ="text/javascript" >
var  xmlDoc  =   new  ActiveXObject( " Microsoft.XMLDOM " )
xmlDoc.async
= " false "
// xmlDoc.validateOnParse="false"只验证XML是否良构
xmlDoc.validateOnParse = " true "
xmlDoc.load(
" note_dtd_error.xml " )

document.write(
" <br />Error Code:  " )
document.write(xmlDoc.parseError.errorCode)
document.write(
" <br />Error Reason:  " )
document.write(xmlDoc.parseError.reason)
document.write(
" <br />Error Line:  " )
document.write(xmlDoc.parseError.line)
</ script >

</ body >
</ html >

最后介绍一个短小精悍的XML编辑器,最重要它是免费的:XRay

转载于:https://www.cnblogs.com/Tuwi/archive/2008/05/09/1189901.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值