XML文檔結(jié)構(gòu)包含下面三個(gè)部分:
* 聲明部分,聲明該文檔是一個(gè)XML文檔.
* 定義部分,定義XML數(shù)據(jù)的類型以及所使用的DTD(可選).
* 內(nèi)容部分,用XML標(biāo)簽和注釋標(biāo)注過(guò)的文檔類容.
聲明
XML文檔以XML聲明開(kāi)頭,聲明本文檔是一個(gè)XML文檔.一般這樣書(shū)寫(xiě):
<? xml version encoding standalone?>
定義符<?和?>表示這是一條給XML解析器的處理指令.雖然聲明這條語(yǔ)句是可有可無(wú)的,但考慮到以后的兼容,建議讀者還是寫(xiě)上為好.隨著語(yǔ)言的進(jìn)一步發(fā)展,以后的瀏覽器如果知道文檔所用的XML版本的話,將是有好處的.這天語(yǔ)句必須全部用小寫(xiě).
在上面的聲明中version表示的XML的標(biāo)準(zhǔn)版本號(hào).encoding表示的是文檔所用的編碼.standalone用來(lái)指定在XML文檔被解析之前,是否使用外部或內(nèi)部DTD,它的值只能是yes或no.如果為no,表示使用外部DTD;如果為yes表示使用內(nèi)部DTD;如果不使用DTD,則不使用這個(gè)屬性.
看下面的實(shí)際例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes">
在XML聲明之后,緊接著是類型定義部分,定義XML文檔中數(shù)據(jù)的類型.
文檔定義類型(DTD)
DTD是用來(lái)定義XML文檔內(nèi)容的結(jié)構(gòu)的,以便按統(tǒng)一的格式存儲(chǔ)信息.DTD規(guī)定了XML文檔中可以出現(xiàn)哪些元素;這些元素是必須的還是可選的;這些元素有什么屬性;以及它們之間的相互位置關(guān)系,等等.XML允許用戶為自己的應(yīng)用程序定義專用的DTD,這樣用戶就可以完全檢查文檔結(jié)構(gòu)和內(nèi)容的過(guò)程了.這一檢驗(yàn)過(guò)程稱為有效化,嚴(yán)格依從一個(gè)DTD的XML文檔被稱作有效文檔.
創(chuàng)建DTD的過(guò)程與在數(shù)據(jù)庫(kù)里創(chuàng)建數(shù)據(jù)表是類似的.在DTD中,用戶定義用來(lái)表示數(shù)據(jù)的元素,然后規(guī)定數(shù)據(jù)的結(jié)構(gòu),并規(guī)定這個(gè)元素是可選的還是必須的,這就好比創(chuàng)建數(shù)據(jù)表的列;然后你把數(shù)據(jù)存入XML文檔,就好比添加數(shù)據(jù)表的記錄.
XML文檔使用的元素可以在內(nèi)部DTD中定義,也可以在外部DTD中定義.
內(nèi)部DTD
DTD可以作為文檔的一部分直接放到文檔里面,這樣的DTD只能用于包含它的這個(gè)文檔,別的文檔就不能使用了.創(chuàng)建內(nèi)部DTD的語(yǔ)法如下:
<!DOCTYPE rootelement
[element and attribute declarations]
>
<!DOCTYPE標(biāo)識(shí)文檔類型定義的開(kāi)始,屬性rootelement指明跟元素名字.
為部DTD
外部DTD是一個(gè)單獨(dú)的文件,存放XML文檔中可以使用的全部元素及屬性的定義.你可以在多個(gè)文檔中同時(shí)使用同一個(gè)DTD,以便保持多個(gè)文檔之間數(shù)據(jù)結(jié)構(gòu)的一致性。
在XML文檔中引用外部DTD的語(yǔ)法如下:
<!DOCTYPE rootelement [PUBLIC|SYSTEM] "name-of-file">
其中,DOCTYPE標(biāo)識(shí)這是文檔類型定義部分;rootelement代表根元素;PUBLIC表示這個(gè)DTD是存放在公用服務(wù)器上的;SYSTEM表示這個(gè)DTD是存放在本地計(jì)算機(jī)系統(tǒng)上的;Name-of-file是被引用的DTD文件的名稱.
DTD字符
下表是DTD中使用的部分專用字符及其含義.
DTD字符 | 含義 | 舉例 | 描述 | |
, | 指定順序中的"與" | Firstname ,Lastname | Firstname與Lastname,以此順序 | |
| | "或" | Firstname | Lastname | Firstname或Lastname | |
? | "可選項(xiàng)',只能出現(xiàn)一次 | Lastname? | 可以不出現(xiàn)Lastname,但如果使用,則只能出現(xiàn)一次 | |
() | 用于組成元素 | (Firstname | Lastname),Address | 一個(gè)Firstname或Lastname元素必須出現(xiàn)在Address元素之前 | |
* | 該元素可以不出現(xiàn)也可以出現(xiàn)多次 | (Firstname | Lastname)* | 可以以任何順序出現(xiàn)任意個(gè)數(shù)Firstname或Lastname元素 | |
? + | 該元素至少出現(xiàn)一次也可以出現(xiàn)多次 | (Firstname +) | 可以出現(xiàn)多個(gè)Firstname元素 | |
在DTD中定義元素
元素是XML文件的基本組成部分.每個(gè)元素都是用標(biāo)簽標(biāo)識(shí)的一小段數(shù)據(jù).標(biāo)簽包括了元素的名字和屬性.
XML允許用于創(chuàng)建自己的元素集.因此,元素名應(yīng)該取得容易記憶,并且最好有一定的含義,讓人一看到它,便對(duì)里面的數(shù)據(jù)有個(gè)大概的了解.XML是大小寫(xiě)敏感的,所以要么你全用大寫(xiě),要么就一律用小寫(xiě).
定義元素的語(yǔ)法如下:
<!ELEMENT elementname content>
在DTD中,你通過(guò)創(chuàng)建一個(gè)元素內(nèi)容模型(element content model)來(lái)精確的規(guī)定一個(gè)元素中是否喊有其它元素,可以出現(xiàn)多少次以及按什么順序出現(xiàn).如果元素中只包含別的元素,而不包含字符數(shù)據(jù),我們就說(shuō)它只含有元素內(nèi)容.
XML中命名元素的規(guī)則
* 元素名至少要含有一個(gè)字母(a-z或A-Z中的一個(gè))
* 元素名可以用下劃線(_)或冒號(hào)( : )開(kāi)頭.
* 第一個(gè)字符后面可以是一個(gè)或多個(gè)字母,數(shù)字,連字符,下劃線或句號(hào),但不能是空格和定位符(tab),至于標(biāo)點(diǎn)符號(hào)只能使用連字符(-)和句號(hào)(.).
對(duì)于完整的命名規(guī)則,請(qǐng)參看
http://www.w3.org/XML/上的在線XML介紹
元素類型
元素有空元素,自由元素和容器元素三種(如下表:)
元素類型 | 語(yǔ)法 | |
空元素(Empty) | <!ELEMENT empty.element EMPTY> | <!ELEMENT empty.element EMPTY> |
自由元素(Unrestricted) | <!ELEMENT any.element ANY> | <!ELEMENT any.element ANY> |
容器元素(Container) | <!ELEMENT TITLE(#PCDATA)> | <!ELEMENT TITLE(#PCDATA)> |
PCDATA 表示 parsable character data,既可解析的字符數(shù)據(jù).為了避免將這一關(guān)鍵字與普通的元素名混淆起來(lái),在此關(guān)鍵字前加前綴字符#.
分析下面的標(biāo)簽結(jié)構(gòu):
<student>
<firstname> Blove </firstname>
<lastname> Saga </lastname>
<rollno> 49 </rollno>
<score> 70 </score>
</student>
要使上面的文檔生效,必須創(chuàng)建一個(gè)DTD,里面包含student,firstname,lastname,rollno,score等五個(gè)元素的定義.另外,還要規(guī)定這五個(gè)元素是必須的或可選的;以規(guī)定順序或任意排序;以及它們出現(xiàn)的次數(shù).用戶為這些規(guī)定編寫(xiě)元素定義,每個(gè)元素的定義可能不同.
譬如,如果firstname和lastname都是必需的元素,并且firstname要在lastname后面,那么DTD可以這樣編寫(xiě):
<!ELEMENT student ?(firstname,lastname)><!--元素內(nèi)容-->
<!ELEMENT firstname (#PCDATA)><!--元素內(nèi)容-->
<!ELEMENT?lastname? (#CDATA)><!--元素內(nèi)容-->
注意:
數(shù)據(jù)類型#CDATA表示元素包含字符型數(shù)據(jù),解析器不解析這些數(shù)據(jù),其中的標(biāo)簽是不作為標(biāo)記的.
數(shù)據(jù)類型#PCDATA表示元素包含字的數(shù)據(jù)將由解析器解析,其中的標(biāo)簽是被作為標(biāo)記處理.