Heim > Artikel > Backend-Entwicklung > Verrückte XML-Studiennotizen (3) -----------XML und DTD
Document Type Definition (DTD) definiert die rechtlichen Bausteine von XML-Dokumenten. Es verwendet eine Reihe rechtlicher Elemente, um die Struktur des Dokuments zu definieren.
DTD kann in einem XML-Dokument als Zeile oder als externe Referenz deklariert werden.
Wenn die DTD in Ihrer XML-Quelldatei enthalten ist, sollte sie die folgende Syntax einschließen eine DOCTYPE-Deklaration:
<!DOCTYPE 根元素 [元素声明]>
XML-Dokumentinstanz mit DTD
<?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>
!DOCTYPE note (zweite Zeile) definiert, dass dieses Dokument vom Typ note Dokument ist.
!ELEMENT note (Dritte Zeile) Definition Das Element note besteht aus vier Elementen: „to, from, heading,, body“
!ELEMENT to (die vierte Zeile) definiert das Element to als „#PCDATA“-Typ
!ELEMENT from (fünfte Zeile) definiert das frome-Element als „#PCDATA“-Typ
!ELEMENT-Überschrift (Sechste Zeile) Definition Überschrift Element ist vom Typ „#PCDATA“
!ELEMENT-Körper (Siebte Zeile) Definitionbody Element ist vom Typ „#PCDATA“
Wenn sich die DTD außerhalb der XML-Quelldatei befindet, sollte sie in einer DOCTYPE-Definition mit der folgenden Syntax gekapselt werden:
<!DOCTYPE 根元素 SYSTEM "文件名">
Dieses XML-Dokument ist dasselbe wie das XML Dokument oben, hat aber eine externe DTD: (Und wählen Sie den Befehl „Quelle anzeigen“.)
<?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>
Dies ist die Datei „note.dtd“, die die DTD enthält:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
Mit einer DTD kann jede Ihrer XML-Dateien eine Beschreibung ihres eigenen Formats enthalten.
Mit DTD können unabhängige Gruppen durchgängig eine Standard-DTD zum Datenaustausch nutzen.
Ihre Anwendung kann auch eine Standard-DTD verwenden, um von außen empfangene Daten zu validieren.
Sie können DTDs auch verwenden, um Ihre eigenen Daten zu überprüfen.
Alle XML-Dokumente (sowie HTML-Dokumente) bestehen aus den folgenden einfachen Bausteinen:
Element
Attribute
Entität
PCDATA
CDATA
Nachfolgend finden Sie eine kurze Beschreibung jedes Bausteins. Das
-Element ist der -Hauptbaustein von XML und HTML-Dokumente .
Beispiele für HTML-Elemente sind „body“ und „table“. Beispiele für XML-Elemente sind „note“ und „message“. Elemente können Text oder andere Elemente enthalten oder leer sein. Beispiele für leere HTML-Elemente sind „hr“, „br“ und „img“.
<body>body text in between</body> <message>some message in between</message>
Attribute stellen zusätzliche Informationen über das Element bereit. Das Attribut
wird immer im Eröffnungs-Tag eines Elements platziert. Eigenschaften erscheinen immer in Name/Wert-Paaren. Das folgende „img“-Element enthält zusätzliche Informationen zur Quelldatei:
<img src="computer.gif" />
Der Name des Elements ist „img“. Der Name des Attributs ist „src“. Der Wert der Eigenschaft ist „computer.gif“. Da das Element selbst leer ist, wird es mit einem „/“ abgeschlossen.
实体是用来定义普通文本的变量。实体引用是对实体的引用。
大多数同学都了解这个 HTML 实体引用:" "。这个“无折行空格”实体在 HTML 中被用于在某个文档中插入一个额外的空格。
当文档被 XML 解析器解析时,实体就会被展开。
实体引用 | 字符 |
---|---|
< | c43c79d002e5359a19cdc7913511431b |
& | & |
" | " |
' | ' |
PCDATA 的意思是被解析的字符数据(parsed character data)。
可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。
PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
文本中的标签会被当作标记来处理,而实体会被展开。
不过,被解析的字符数据不应当包含任何 &、d9cc50603bc7f01c48909aac2ab47bd6 字符;需要使用 &、< 以及 > 实体来分别替换它们。
在一个 DTD 中,元素通过元素声明来进行声明。
在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>
空元素通过类别关键词EMPTY进行声明:
<!ELEMENT 元素名称 EMPTY>
<!ELEMENT br EMPTY>
<br />
只有 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 元素名称 (子元素名称)>
<!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 元素名称 属性名称 属性类型 默认值>
<!ATTLIST payment type CDATA "check">
<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 | 属性值是固定的 |
<!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0">
<square width="100" />
在上面的例子中,"square" 被定义为带有 CDATA 类型的 "width" 属性的空元素。如果宽度没有被设定,其默认值为0 。
<!ATTLIST 元素名称 属性名称 属性类型 #IMPLIED>
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
合法的 XML:
<contact fax="555-667788" />
合法的 XML:
<contact />
假如您不希望强制作者包含属性,并且您没有默认值选项的话,请使用关键词 #IMPLIED。
<!ATTLIST 元素名称 属性名称 属性类型 #REQUIRED>
DTD:
<!ATTLIST person number CDATA #REQUIRED>
合法的 XML:
<person number="5677" />
非法的 XML:
<person />
假如您没有默认值选项,但是仍然希望强制作者提交属性的话,请使用关键词 #REQUIRED。
<!ATTLIST 元素名称 属性名称 属性类型 #FIXED "value">
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3School" />
如果您希望属性拥有固定的值,并不允许作者改变这个值,请使用 #FIXED 关键词。如果作者使用了不同的值,XML 解析器会返回错误。
<!ATTLIST 元素名称 属性名称 (en1|en2|..) 默认值>
<!ATTLIST payment type (check|cash) "cash">
<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 解析器有可能会产生错误。通过访问 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 文件了。
<!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> ]>
<!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"> ]>
拷贝自:http://www.php.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 的内容,更多相关内容请关注PHP中文网(www.php.cn)!