文档类型定义(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

posted @ 2008-05-09 22:31  Tuwi  阅读(862)  评论(0编辑  收藏  举报