XML 文档
<! 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 memory (subdate, donor, subject) >
<! ATTLIST memory tapeid CDATA #REQUIRED >
<! ELEMENT subdate (#PCDATA) >
<! ELEMENT donor (#PCDATA) >
<! ELEMENT subject (#PCDATA) >
上面是以引用外部dtd文件的方式,如果是内嵌于XML文档,就:
<! 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 < 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。代码如下:
< 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