DTD笔录
主要内容:
①如何描述 XML 文档的结构;
②如何使用 DTD 来定义一个 XML 文档的合法元素,以及如何在您的 XML 内部或者作为一个外部引用来声明 DTD;
③如何为 XML 文档声明合法的元素、属性、实体以及 CDATA 部分;
④如何根据某个 DTD 来验证一个 XML 文档
(1)简介
DTD(document type defined文档类型定义)的作用是定义 XML 文档的合法构建模块。可被成行地声明于 XML 文档中(内部文档声明),也可作为一个外部引用(外部文档声明)
①内部的 DOCTYPE 声明:
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE root-element(根元素)[element-declarations(元素声明)]>
②外部文档声明:
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE root-element(根元素) SYSTEM(系统)"filename">
③作用:
通过 DTD,每一个 XML 文件均可携带一个有关其自身格式的描述;并且独立的团体可一致地使用某个标准的 DTD 来交换数据。
应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据,还可以使用 DTD 来验证您自身的数据。
(2)XML构建模块
XML 和 HTML文档的主要的构建模块是元素标签
①XML 文档构建模块
所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:元素,属性,实体,PCDATA,CDATA
下面依次解析各个构成:
1 . 元素是 XML 以及 HTML 文档的主要构建模块,元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img";
2 . 属性可提供有关元素的额外信息,且总是被置于某元素的开始标签中;
3 . 实体(实体引用/字符)是用来定义普通文本的变量。实体引用是对实体的引用,当文档被 XML 解析器解析时,实体就会被展开;
4 . PCDATA(parsed character data解析字符数据)是会被解析器解析的文本。
这些文本将被解析器检查实体以及标记,文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们;
5. CDATA(character data字符数据)是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。
【拓展】
CDATA:属性声明中的类型,就是字符串,&、<、“”和‘’ 等都具有特殊含义被解析,例如:"解析为双引号,一般指不由 XML 解析器进行解析的文本数据;
PCDATA:元素声明中的类型,指的是混合类型,即可以包子元素也可包含字符串, &和<也是具有特殊含义被解析。它是XML解析器解析的文本数据使用的一个术语。XML 文档中的文本通常解析为字符数据,或者(按照文档类型定义术语)称为 PCDATA
(3)DTD元素
DTD元素通过元素声明来声明元素
【声明一个元素】
元素声明使用下面的语法:
<!ELEMENT element-name category类别> 或 <!ELEMENT element-name (element-content元素内容)>
1. 空元素:通过类别关键词EMPTY进行声明:
<!ELEMENT element-name EMPTY> 以下为实例: <!ELEMENT br EMPTY> XML example: <br />
2.只有 PCDATA 的元素:通过圆括号中的 #PCDATA 进行声明:
<!ELEMENT element-name (#PCDATA)> 以下为实例: <!ELEMENT from (#PCDATA)>
3.带有任何内容的元素:通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:
<!ELEMENT element-name ANY> 以下为实例: <!ELEMENT note ANY>
4.带有子元素(序列)的元素:通过圆括号中的子元素名进行声明
<!ELEMENT element-name (child1,child2,...)> 以下为实例: <!ELEMENT note (to,from,heading,body)>
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
5 . 声明只出现一次的元素
<!ELEMENT element-name (child-name)> 以下为实例: <!ELEMENT note (message)>
上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次
6 . 声明最少出现一次的元素
<!ELEMENT element-name (child-name+)> 以下为实例: <!ELEMENT note (message+)>
上面的例子中的加号(+)声明了:message 子元素必须在 "note" 元素内出现至少一次
7 . 声明出现零次或多次的元素
<!ELEMENT element-name (child-name*)> 以下为实例: <!ELEMENT note (message*)>
上面的例子中的星号(*)声明了:子元素 message 可在 "note" 元素内出现零次或多次
8 . 声明出现零次或一次的元素
<!ELEMENT element-name (child-name?)> 以下为实例: <!ELEMENT note (message?)>
上面的例子中的问号(?)声明了:子元素 message 可在 "note" 元素内出现零次或一次
9 . 声明"非.../既..."类型的内容
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素
10 . 声明混合型的内容
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"
(4)DTD属性
在 DTD 中,属性通过 ATTLIST 声明来进行声明
属性声明语法:
<!ATTLIST element-name元素名 attribute-name属性名 attribute-type属性类型 attribute-value>
DTD 实例:
<!ATTLIST payment type CDATA "check">
XML 实例:
<payment type="check" />
(5)XML元素vs属性
在HTML重多使用属性,但在XML中,使用子元素,会感觉更像数据信息
同时要尽量避免使用属性:
一些属性具有以下问题:
属性不能包含多个值(子元素可以);不容易扩展(为以后需求的变化);无法描述结构(子元素可以);更难以操纵程序代码;不容易测试,针对DTD
上面有具体解析
(6)DTD实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
实体引用是对实体的引用,可在内部或外部进行声明
内部实体声明:
<!ENTITY entity-name实体名称 "entity-value"> 以下为实例 DTD 实例: <!ENTITY writer "Donald Duck."> <!ENTITY copyright "Copyright runoob.com"> XML 实例: <author>&writer;©right;</author>
注意: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)
外部实体声明
<!ENTITY entity-name SYSTEM "URI/URL"> 以下为实例 DTD 实例: <!ENTITY writer SYSTEM "http://www.runoob.com/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.runoob.com/entities.dtd"> XML 例子: <author>&writer;©right;</author>
(7)DTD验证
使用IE可根据某个 DTD 来验证您的 XML
【通过 XML 解析器进行验证】
当试图打开某个 XML 文档时,XML 解析器有可能会产生错误。通过访问 parseError 对象,就可以取回引起错误的确切代码、文本甚至所在的行
注意: load() 方法用于文件,而 loadXML() 方法用于字符串
【关闭验证:通过把 XML 解析器的 validateOnParse 设置为 "false",就可以关闭验证】
.