DTD 可被成行地声明于 XML 文档中,也可作为一个外部援用。
内部的 DOCTYPE 声明
假如 DTD 被包括在您的 XML 源文件中,它应该经由过程下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE 根元素 [元素声明]>
带有 DTD 的 XML 文档实例
<?xml version="1.0"?> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
以上 DTD 诠释以下:
!DOCTYPE note (第二行)定义此文档是 note 范例的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 范例
!ELEMENT from (第五行)定义 frome 元素为 "#PCDATA" 范例
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 范例
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 范例
外部文档声明
假如 DTD 位于 XML 源文件的外部,那末它应经由过程下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">
这个 XML 文档和上面的 XML 文档雷同,然则具有一个外部的 DTD: (并挑选“检察源代码”敕令。)
<?xml version="1.0"?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
这是包括 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
为何运用 DTD?
经由过程 DTD,您的每一个 XML 文件都可照顾一个有关其本身花样的形貌。
经由过程 DTD,自力的整体可一致地运用某个规范的 DTD 来交流数据。
而您的应用程序也可运用某个规范的 DTD 来考证从外部接收到的数据。
您还能够运用 DTD 来考证您本身的数据。
XML 文档构建模块
一切的 XML 文档(以及 HTML 文档)均由以下简朴的构建模块组成:
元素
属性
实体
PCDATA
CDATA
下面是每一个构建模块的扼要形貌。
元素
元素是 XML 以及 HTML 文档的重要构建模块。
HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包括文本、其他元素或许是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。
实例:
<body>body text in between</body> <message>some message in between</message>
属性
属性可提供有关元素的分外信息。
属性老是被置于某元素的最先标签中。属性老是以称号/值的情势成对涌现的。下面的 "img" 元素具有关于源文件的分外信息:
<img src="computer.gif" />
元素的称号是 "img"。属性的称号是 "src"。属性的值是 "computer.gif"。因为元素本身为空,它被一个 " /" 封闭。
实体
实体是用来定义一般文本的变量。实体援用是对实体的援用。
大多数同砚都相识这个 HTML 实体援用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插进去一个分外的空格。
当文档被 XML 剖析器剖析时,实体就会被睁开。
下面的实体在 XML 中被预定义:
实体援用 | 字符 |
---|---|
< | < |
> | > |
& | & |
" | " |
' | ' |
PCDATA
PCDATA 的意义是被剖析的字符数据(parsed character data)。
可把字符数据设想为 XML 元素的最先标签与完毕标签之间的文本。
PCDATA 是会被剖析器剖析的文本。这些文本将被剖析器搜检实体以及标记。
文本中的标签会被看成标记来处置惩罚,而实体会被睁开。
不过,被剖析的字符数据不应该包括任何 &、< 或许 > 字符;须要运用 &、< 以及 > 实体来离别替代它们。
在一个 DTD 中,元素经由过程元素声明来举行声明。
声明一个元素
在 DTD 中,XML 元素经由过程元素声明来举行声明。元素声明运用下面的语法:
<!ELEMENT 元素称号 种别>
或许
<!ELEMENT 元素称号 (元素内容)>
空元素
空元素经由过程种别关键词EMPTY举行声明:
<!ELEMENT 元素称号 EMPTY>
例子:
<!ELEMENT br EMPTY>
XML例子:
<br />
只要 PCDATA 的元素
只要 PCDATA 的元素经由过程圆括号中的 #PCDATA 举行声明:
<!ELEMENT 元素称号 (#PCDATA)>
例子:
<!ELEMENT from (#PCDATA)>
带有任何内容的元素
经由过程种别关键词 ANY 声明的元素,可包括任何可剖析数据的组合:
<!ELEMENT 元素称号 ANY>
例子:
<!ELEMENT note ANY>
带有子元素(序列)的元素
带有一个或多个子元素的元素经由过程圆括号中的子元素名举行声明:
<!ELEMENT 元素称号 (子元素称号 1)>
或许
<!ELEMENT 元素称号 (子元素称号 1,子元素称号 2,.....)>
例子:
<!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)>
声明只涌现一次的元素
<!ELEMENT 元素称号 (子元素称号)>
例子:
<!ELEMENT note (message)>
上面的例子声清楚明了:message 子元素必须涌现一次,而且必须只在 "note" 元素中涌现一次。
声明起码涌现一次的元素
<!ELEMENT 元素称号 (子元素称号+)>
例子:
<!ELEMENT note (message+)>
上面的例子中的加号声清楚明了:message 子元素必须在 "note" 元素内涌现最少一次。
声明涌现零次或屡次的元素
<!ELEMENT 元素称号 (子元素称号*)>
例子:
<!ELEMENT note (message*)>
上面的例子中的星号声清楚明了:子元素 message 可在 "note" 元素内涌现零次或屡次。
声明涌现零次或一次的元素
<!ELEMENT 元素称号 (子元素称号?)>
例子:
<!ELEMENT note (message?)>
上面的例子中的问号声清楚明了:子元素 message 可在 "note" 元素内涌现零次或一次。
声明“非.../既...”范例的内容
例子:
<!ELEMENT note (to,from,header,(message|body))>
上面的例子声清楚明了:"note" 元素必须包括 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素既 "body" 元素。
声明混合型的内容
例子:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
上面的例子声清楚明了:"note" 元素可包括涌现零次或屡次的 PCDATA、"to"、"from"、"header" 或许 "message"。
声明属性
属性声明拥运用以下语法:
<!ATTLIST 元素称号 属性称号 属性范例 默许值>
DTD 实例:
<!ATTLIST payment type CDATA "check">
XML 实例:
<payment type="check" />
以下是属性范例的选项:
范例 | 形貌 |
---|---|
CDATA | 值为字符数据 (character data) |
(en1|en2|..) | 此值是罗列列表中的一个值 |
ID | 值为唯一的 id |
IDREF | 值为别的一个元素的 id |
IDREFS | 值为其他 id 的列表 |
NMTOKEN | 值为正当的 XML 称号 |
NMTOKENS | 值为正当的 XML 称号的列表 |
ENTITY | 值是一个实体 |
ENTITIES | 值是一个实体列表 |
NOTATION | 此值是标记的称号 |
xml: | 值是一个预定义的 XML 值 |
默许值参数可运用以下值:
值 | 诠释 |
---|---|
值 | 属性的默许值 |
#REQUIRED | 属性值是必须的 |
#IMPLIED | 属性不是必须的 |
#FIXED value | 属性值是牢固的 |
划定一个默许的属性值
DTD:
<!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">
正当的 XML:
<square width="100" />
在上面的例子中,"square" 被定义为带有 CDATA 范例的 "width" 属性的空元素。假如宽度没有被设定,其默许值为0 。
#IMPLIED
语法
<!ATTLIST 元素称号 属性称号 属性范例 #IMPLIED>
例子
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
正当的 XML:
<contact fax="555-667788" />
正当的 XML:
<contact />
假如您不愿望强迫作者包括属性,而且您没有默许值选项的话,请运用关键词 #IMPLIED。
#REQUIRED
语法
<!ATTLIST 元素称号 属性称号 属性范例 #REQUIRED>
例子
DTD:
<!ATTLIST person number CDATA #REQUIRED>
正当的 XML:
<person number="5677" />
不法的 XML:
<person />
假如您没有默许值选项,然则依然愿望强迫作者提交属性的话,请运用关键词 #REQUIRED。
#FIXED
语法
<!ATTLIST 元素称号 属性称号 属性范例 #FIXED "value">
例子
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
正当的 XML:
<sender company="Microsoft" />
不法的 XML:
<sender company="W3School" />
假如您愿望属性具有牢固的值,并不许可作者转变这个值,请运用 #FIXED 关键词。假如作者运用了差别的值,XML 剖析器会返回毛病。
枚举属性值
语法:
<!ATTLIST 元素称号 属性称号 (en1|en2|..) 默许值>
DTD 例子:
<!ATTLIST payment type (check|cash) "cash">
XML 例子:
<payment type="check" />
或许
<payment type="cash" />
假如您愿望属性值为一系列牢固的正当值之一,请运用枚举属性值。
实体是用于定义用于定义援用一般文本或特别字符的快捷方式的变量。
实体援用是对实体的援用。
实体可在内部或外部举行声明。
一个内部实体声明
语法:
<!ENTITY 实体称号 "实体的值">
例子:
DTD 例子:
<!ENTITY writer "Bill Gates"> <!ENTITY copyright "Copyright W3School.com.cn">
XML 例子:
<author>&writer;©right;</author>
解释: 一个实体由三部份组成: 一个和号 (&), 一个实体称号, 以及一个分号 (;)。
一个外部实体声明
语法:
<!ENTITY 实体称号 SYSTEM "URI/URL">
例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"> <!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
XML 例子:
<author>&writer;©right;</author>
经由过程 XML 剖析器举行考证
当您试图翻开某个 XML 文档时,XML 剖析器有可能会发生毛病。经由过程接见 parseError 对象,就能够取回引发毛病的确实代码、文本以至地点的行。
解释:load( ) 要领用于文件,而 loadXML( ) 要领用于字符串。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" 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)
封闭考证
经由过程把 XML 剖析器的 validateOnParse 设置为 "false",就能够封闭考证。
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.validateOnParse="false" 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)
Try it Yourself
通用的 XML 考证器
为了帮助您考证 XML 文件,我们创建了此链接,如许你就能够考证任何 XML 文件了。
parseError 对象
电视节目表 DTD
<!DOCTYPE TVSCHEDULE [ <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED> ]>
报纸文章 DTD
<!DOCTYPE NEWSPAPER [ <!ELEMENT NEWSPAPER (ARTICLE+)> <!ELEMENT ARTICLE (HEADLINE,BYLINE,LEAD,BODY,NOTES)> <!ELEMENT HEADLINE (#PCDATA)> <!ELEMENT BYLINE (#PCDATA)> <!ELEMENT LEAD (#PCDATA)> <!ELEMENT BODY (#PCDATA)> <!ELEMENT NOTES (#PCDATA)> <!ATTLIST ARTICLE AUTHOR CDATA #REQUIRED> <!ATTLIST ARTICLE EDITOR CDATA #IMPLIED> <!ATTLIST ARTICLE DATE CDATA #IMPLIED> <!ATTLIST ARTICLE EDITION CDATA #IMPLIED> <!ENTITY NEWSPAPER "Vervet Logic Times"> <!ENTITY PUBLISHER "Vervet Logic Press"> <!ENTITY COPYRIGHT "Copyright 1998 Vervet Logic Press"> ]>
产品目录 DTD
拷贝自:http://www.ki4.cn/
<!DOCTYPE CATALOG [ <!ENTITY AUTHOR "John Doe"> <!ENTITY COMPANY "JD Power Tools, Inc."> <!ENTITY EMAIL "jd@jd-tools.com"> <!ELEMENT CATALOG (PRODUCT+)> <!ELEMENT PRODUCT (SPECIFICATIONS+,OPTIONS?,PRICE+,NOTES?)> <!ATTLIST PRODUCT NAME CDATA #IMPLIED CATEGORY (HandTool|Table|Shop-Professional) "HandTool" PARTNUM CDATA #IMPLIED PLANT (Pittsburgh|Milwaukee|Chicago) "Chicago" INVENTORY (InStock|Backordered|Discontinued) "InStock"> <!ELEMENT SPECIFICATIONS (#PCDATA)> <!ATTLIST SPECIFICATIONS WEIGHT CDATA #IMPLIED POWER CDATA #IMPLIED> <!ELEMENT OPTIONS (#PCDATA)> <!ATTLIST OPTIONS FINISH (Metal|Polished|Matte) "Matte" ADAPTER (Included|Optional|NotApplicable) "Included" CASE (HardShell|Soft|NotApplicable) "HardShell"> <!ELEMENT PRICE (#PCDATA)> <!ATTLIST PRICE MSRP CDATA #IMPLIED WHOLESALE CDATA #IMPLIED STREET CDATA #IMPLIED SHIPPING CDATA #IMPLIED> <!ELEMENT NOTES (#PCDATA)> ]>
以上就是猖獗XML进修笔记(3)-----------XML与DTD 的内容,更多相关内容请关注ki4网(www.ki4.cn)!