1. DTD
簡介
DTD(Document Type Definition)
定義了
XML
文檔的合法構造塊,他用一系列合法的元素定義文檔結構
DTD
可以在
XML
文檔的內部聲明,也可以外部引用
為什么要用
DTD
呢?
使用
DTD
,我們每個
XML
文件都可以有自己的格式描述
使用
DTD
,獨立的組織間可以用公用的
DTD
交換數據
在你的應用中可以用
DTD
檢驗你從外界得到的數據是否有效
內部
DOCTYPE
聲明
語法:
<!DOCTYPE root-element [element-declarations]>
看個例子:
?
<?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>Tove</to>
? <from>Jani</from>
? <heading>Reminder</heading>
? <body>Don't forget me this weekend</body>
</note>
?
!DOCTYPE note
定義了這是一個
note
類型的文檔
!ELEMENT note
定義
note
有
4
個子元素
to,from,heading,body
!ELEMENT to
定義
to
這個元素是
#PCDATA
類型的
其他類似
外部
DOCTYPE
聲明
語法:
<!DOCTYPE root-element SYSTEM "filename">
例子:
?
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
note.dtd:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
?
我們已經定義了
DTD
,也按照定義寫了
XML
文檔,那如何驗證呢?下面就用
javascript
驗證一下
先寫個錯誤的
XML
,然后用
javascript
檢驗
?
note_dtd_error.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>Tove</to>
<fromm>Jani</fromm>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
validate.html:
<html>
<body>
<h3>
This demonstrates a parser error:
</h3>
<script type="text/javascript">
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)
</script>
</body>
</html>
?
運行
validate.html
可以看到以下信息:
?
This demonstrates a parser error:
Error Code: -1072898028
Error Reason:
根據
DTD/Schema
,元素內容無效。預期
: from
。
Error Line: 12
?
DTD
的概貌和如何驗證已經看過了,接下來看一下
DTD
的具體語法
2. DTD-XML
構造塊
在
DTD
看來,
XML
文檔都是由以下簡單的改造塊構成的:
Elements
Attributes
Entities
PCDATA
CDATA
Elements
Elements
是主要的構造塊,可以包含文本,其他元素,或者為空,如
?<message>some message in between</message>?
Attributes
Attributes
為
Elements
提供額外信息,他總是在
Elements
的起始標簽中,總是以
name/value
對
出現
Entities
Entities
是用語定義通用文本的變量,
Entities
在
XML
文檔被解析時被展開,下面的是
XML
預定義的實體:
<????????? <?
>???????? >?
&????? &?
"????? "?
'???? '?
PCDATA
PCDATA
是字符數據,是會被解析的文本,文本中的
tags
會被當作標記處理,
entities
會被展開
CDATA
CDATA
也是字符數據,但他是不會被解析的文本,文本中的
tags
不會被當作標記處理,
entities
也不會被展開
3. Elements
(1)
聲明一個
Element
,語法:
?
<!ELEMENT element-name category>
or
<!ELEMENT element-name (element-content)>
?
(2)Empty elements,
用關鍵字
EMPTY
來聲明
?
<!ELEMENT element-name EMPTY>
example:
<!ELEMENT br EMPTY>
XML example:
<br />
?
(3)Elements
只包含字符數據時,用
#PCDATA?
來聲明
?
<!ELEMENT element-name (#PCDATA)>
example:
<!ELEMENT from (#PCDATA)>
?
(4)Elements with any contents,
用
ANY
聲明時,元素可包含任何可以被解析的數據
?
<!ELEMENT element-name ANY>
example:
<!ELEMENT note ANY>
?
(5)Elements with children (sequences)
?
<!ELEMENT element-name
?(child-element-name)>
or
<!ELEMENT element-name
?(child-element-name,child-element-name,.....)>
?
?example:
?<!ELEMENT note (to,from,heading,body)>
?
子元素出現的順序必須和聲明時的一致,子元素也可以有子元素
(6)
聲明相同元素只出現一次
?
<!ELEMENT element-name (child-name)>
example:
<!ELEMENT note (message)>
說明
message
在
note
中只能出現一次
?
(7)
聲明相同元素至少出現一次
?
<!ELEMENT element-name (child-name+)>
example:
<!ELEMENT note (message+)>
"+"
說明
message
在
note
中至少出現一次
?
(7)
聲明相同元素出現
0
次或多次
?
<!ELEMENT element-name (child-name*)>
example:
<!ELEMENT note (message*)>
"*"
說明
message
在
note
中的出現是隨意的
?
(8)
聲明相同元素出現
0
次或一次
?
<!ELEMENT element-name (child-name?)>
example:
<!ELEMENT note (message?)>
"?"
說明
message
在
note
中可不出現,或者出現一次
?
(9)
聲明
either/or
內容
?
example:
<!ELEMENT note (to,from,header,(message|body))>
note
必須包含一個
to,
一個
from,
一個
header,
和
message body
其中之一
?
(10)
聲明混合內容
?
example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>
note
可以包含
可被解析的字符,
to, from, header, message,
并且可以出現任意次
?
4. Attributes
(1)
聲明
Attributes
,語法:
?
<!ATTLIST element-name attribute-name
?attribute-type default-value>
?
?example:
?DTD example:
<!ATTLIST payment type CDATA "check">
XML example:
<payment type="check" />
?
attribute-type
有下列值:
CDATA???
字符數據
(en1|en2|..)???
值必須是枚舉列表中的一個
ID??? unique id
IDREF???
其他元素的
id
IDREFS???
其他
id
列表
NMTOKEN???
一個有效的
XML
名字
NMTOKENS???
有效的
XML
名列表
ENTITY????
一個實體
ENTITIES???
一個實體列表
NOTATION???
一個符號名
xml:???
一個預定義的
XML
值
default-value
有下列值:
value???
默認值
#REQUIRED???
這個屬性必須出現
#IMPLIED???
這個屬性不是必須的
#FIXED value???
這個屬性的只是固定的
(2)
指定一個默認值屬性
?
DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Valid XML:
<square width="100" />
square
被定義為一個空元素,他有一個
CDATA
類型的屬性
width
,如果
width
沒被指定值,那他就是
0
?
(3) #IMPLIED
語法:
?
<!ATTLIST element-name attribute-name
attribute-type #IMPLIED>
example:
DTD:
<!ATTLIST contact fax CDATA #IMPLIED>
Valid XML:
<contact fax="555-667788" />
Valid XML:
<contact />
?
(4) #REQUIRED
語法:
?
<!ATTLIST element-name attribute_name
attribute-type #REQUIRED>
Example
DTD:
<!ATTLIST person number CDATA #REQUIRED>
Valid XML:
<person number="5677" />
Invalid XML:
<person />
?
(5) #FIXED
語法:
?
<!ATTLIST element-name attribute-name
attribute-type #FIXED "value">
Example
DTD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Valid XML:
<sender company="Microsoft" /
Invalid XML:
<sender company="W3Schools" />
?
(6) Enumerated attribute values
?
<!ATTLIST element-name
?attribute-name (en1|en2|..) default-value>
?
?DTD example:
<!ATTLIST payment type (check|cash) "cash">
XML example:
<payment type="check" />
or
<payment type="cash" />
?
5. Entities
Entities
是用來為普通文本定義捷徑
有兩種聲明方式:
(1)
內部聲明
?
Syntax:
<!ENTITY entity-name "entity-value">
DTD Example:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML example:
<author>&writer;©right;</author>
?
(2)
外部聲明
?
posted on 2007-01-12 19:00
???MengChuChen 閱讀(416)
評論(0) 編輯 收藏 所屬分類:
flex2.0