(本系列文章是我學(xué)習(xí)的過程中,整理出來的筆記,如有錯漏,看官請一定不吝回復(fù),讓我能認(rèn)識自己的不足,并改進錯誤。非常感謝!)
推薦一個XML編輯工具,強大的XMLSpy,我用的是2008版。
XML文檔的結(jié)構(gòu)可以從物理和邏輯兩方面來看。
一、從物理上而言,文檔由稱為實體(entities)的存儲單元組成,實體都是具有內(nèi)容并且都通過實體的名字進行標(biāo)識(文檔實體和外部DTD子集除外)。實體可以是一段文本,一個文件,一個數(shù)據(jù)庫記錄或者其他包含數(shù)據(jù)的項目,一個實體可以引用其它的實體,從而將它們包含在文檔中。文檔開始于“根(root)”或者文檔實體(document entity)。格式良好的XML文檔形成了一種層次樹結(jié)構(gòu),這個樹結(jié)構(gòu)的樹根就是文檔實體,與其它實體不同,文檔實體沒有名字,只是用于表示文檔樹的根。XML文檔的根元素被稱位文檔元素(document element),它和在其外部出現(xiàn)的處理指令,注釋等作為文檔實體的子節(jié)點,而根元素本身和其內(nèi)部的子元素也是一棵樹。
實體可以包含已分析(parsed)的或未分析的(unparsed)數(shù)據(jù)。已分析的數(shù)據(jù)由字符組成,其中一些字符組成字符數(shù)據(jù),另一些字符組成標(biāo)記。已分析的實體(parsed entity)內(nèi)容被成為它的代替文本,這個文本被看稱是文檔整體的一部分,在XML處理器分析XML文檔時,凡是文檔中出現(xiàn)引用已分析實體的地方,都將被該實體的內(nèi)容所替換。未分析的實體(unparsed entity)是一種資源,它的內(nèi)容可以是也可以不是文本,并且,如果是文本的話,可以不是XML文本,每一個未分析的實體有一個相關(guān)聯(lián)的用名字標(biāo)識的記號(notation)。除了要求XML處理器能向應(yīng)用程序提供可用的實體和記號的標(biāo)志符之外,XML對未分析的的實體內(nèi)容不做任何限制。已分析的實體以實體引用的方式通過名字來調(diào)用,未分析的實體通過ENTITY或ENTITIES屬性中給出的名字來調(diào)用。
二、邏輯上而言,文檔由聲明,元素,注釋,字符引用和處理指令組成,在文檔中,所有這些都是通過顯式的標(biāo)記(markup)來指明的。XML標(biāo)記(markup)包括開始標(biāo)簽(tag)、結(jié)束標(biāo)簽、空元素標(biāo)簽、實體引用、字符引用、注釋、CDATA段定界符、文檔類型聲明、處理指令、XML聲明、文本聲明以及任何在文檔實體頂層的空白(即,在文檔元素之外,且不在任何其它的標(biāo)記內(nèi)部)。
其它所有非標(biāo)記的文本組成文檔的字符數(shù)據(jù)。
XML文檔在邏輯上主要由以下五個部分組成:
1、XML聲明
2、文檔類型聲明
3、元素
4、注釋
5、處理指令
下面具體介紹XML文檔邏輯上的五個部分。
1、XML聲明
XML文檔總是以一個XML聲明開始的,其格式如下
<?xml 版本信息 [編碼信息] [文檔獨立性信息]?>
其中,編碼信息和文檔獨立性信息可以不寫,而使用默認(rèn)值。
需要注意的是,XML聲明總是在XML文檔的最前面,其前面不能出現(xiàn)任何字符。
下面是幾個例子:
<?xml version="1.0"?>
<!--版本信息聲明-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--編碼信息聲明.默認(rèn)值是"UTF-8"-->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--文檔獨立性信息聲明,如果文檔依賴于外部文檔,則需要將standalone屬性設(shè)置為"no"-->
2、文檔類型聲明
DTD(Document Type Definition),文檔類型定義。
首先提一個問題,如果你的一個XML文檔給別人使用,別人怎么才能正確地定義XML文檔中的元素,屬性呢?就好像我們用Struts時,我們需要配置struts-config.xml,但是怎么保證我們的配置是正確的?答案就是用DTD來驗證。
一個遵循XML語法規(guī)則,并遵守相應(yīng)DTD文件約束的XML文檔稱為有效的XML文檔。
XML從SGML繼承了用于定義語法規(guī)則的DTD機制,DTD文件本身是不需要遵循XML規(guī)則的。大部分的XML應(yīng)用都是使用DTD來定義的(還有一部分是用XML Schema來定義的,XML Schema在其專題中學(xué)習(xí))。HTML就有一個標(biāo)準(zhǔn)的DTD文件,所以其組織結(jié)構(gòu)和所有的標(biāo)簽都是固定的,DTD文件本身也是一個文本文件,通常用".DTD"為其擴展名。
文檔類型聲明的作用就是指出XML文檔所用的DTD,文檔類型聲明有兩種形式。
一種是在XML文檔中給出DTD,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE OrganizationChart [
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
]>
<OrganizationChart>
<!--OrganizationChart是該XML文檔的document element-->
<Name>Toone,INC.</Name>
<Office>zhuhai</Office>
<!--因為DTD中定義了Name,Office兩個元素的順序,Office元素不能放在Name元素的前面,否則不是有效的XML文檔-->
</OrganizationChart>
另一種是在一個外部文件定義的DTD文件,如下:
<?xml version="1.0" encoding="UTF-8"?>對應(yīng)DTD文件dtdTest.dtd內(nèi)容為:
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
<Name>Toone,INC.</Name>
<Office>zhuhai</Office>
</OrganizationChart><?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>
3、元素
在XML中,元素由開始標(biāo)簽、元素內(nèi)容和結(jié)束標(biāo)簽構(gòu)成,對于空元素,由空元素標(biāo)簽構(gòu)成。
每一個元素都有一個用名字標(biāo)識的類型,同時它可以由一個屬性說明集,每一個屬性說明有一個名字和一個值。
在給元素命名的時候要注意,以"xml"或其他任何匹配(('X'|'x') ('M'|'m' )('L'|'l' ))的字符串開頭的名字,被保留用于XML規(guī)范的當(dāng)前版本或者后續(xù)版本的標(biāo)準(zhǔn)化。此外,在給元素命名時,還要遵循下列規(guī)范:
1、名字只能以字母、下劃線(_)或者冒號(:)開頭;
2、名字中可以包含字母、數(shù)字、下劃線以及其他在XML標(biāo)準(zhǔn)中允許的字符;
3、名字中不能包含空格;
4、名字中盡可能不要使用冒號(:),因為冒號在名字空間中被用于分隔名字空間前綴和本地部分。
元素的四種形式:
1、空元素
2、帶有屬性的空元素
3、帶有內(nèi)容的元素
4、帶有內(nèi)容和屬性的元素
在一個元素的內(nèi)容中,字符數(shù)據(jù)可以是不包含任何標(biāo)記的起始定界符和CDATA段的定界符的任意字符串,也就是會所在元素的內(nèi)容中,字符數(shù)據(jù)不能有和號(&)和小于號( <),也不能有字符串"]]>"。那么如果我們要用這些字符的話,必須用他們對應(yīng)的字符引用和實體引用來表示,見下表:
元素內(nèi)容的字符引用和實體引用 字符 字符引用
(十進制代碼)
字符引用
(十六進制代碼)
預(yù)定義實體引用 < <
<
<
>
>
>
>
"
"
'
'
&
&
CDATA段中包含的都是純字符數(shù)據(jù),在字符數(shù)據(jù)可以出現(xiàn)的任何地方都可以使用CDATA段。
CDATA段主要用于需要將整個文本解釋為字符數(shù)據(jù)而不是標(biāo)記的情況下。CDATA段中的內(nèi)容不被XML處理器分析,所以可以在其中包含任意的字符。
4、注釋
注釋用于對文檔中的內(nèi)容起到一個說明作用。
在XML文檔中,注釋可以出現(xiàn)在文檔中其它表ijizhiwai的任何聞之,另外,它們還可以在人當(dāng)類型聲明中語法(grammar)允許的地方出現(xiàn)。
XML的注釋和HTML的注釋類似,都是以<!--開始,以-->結(jié)束。位于<!--和-->之間的數(shù)據(jù)將被XML處理器忽略。
使用XML注釋需要注意一下五點:
1、注釋不能出現(xiàn)在XML聲明之前,XML聲明必須是文檔最前面的部分。下面的情況是不允許的:
<!--Author:Jason Chen-->
<?xml version="1.0"?>
2、注釋不能出現(xiàn)在標(biāo)記中,下面的例子是非法的:
<author<!--This document author-->>Jason Chen</author>
3、注釋可以包圍和隱藏標(biāo)記,但是要注意,在注釋掉標(biāo)記以后,要保持文檔的完整結(jié)構(gòu)。
4、字符串"--"(雙連字符)不能出現(xiàn)在注釋中。
5、處理指令
處理指令(Processing Instructions)允許文檔中包含由應(yīng)用程序來處理的指令。在XML文檔中,有可能會包含一些非XML格式的數(shù)據(jù),這些數(shù)據(jù)XML處理器無法處理,我們可以通過處理指令來通知其它應(yīng)用程序來處理這些數(shù)據(jù)。
處理指令的語法和XML聲明類似,以<?開始, 以?>結(jié)束。一個常見的使用樣式表單的處理指令如下所示:
<?xml-stylesheet href="style.css" type="text/css"?>
在開始標(biāo)記<?后的第一個字符"xml-stylesheet"叫做處理指令的目標(biāo),它必須標(biāo)識要用到的應(yīng)用程序,要注意的是對于其它的非W3C定義的處理指令不能以字符串"XML"和"xml"開頭;其余的部分是傳遞給應(yīng)用程序的字符數(shù)據(jù)。應(yīng)用程序從處理指令中取得目標(biāo)和數(shù)據(jù),執(zhí)行要求的動作。
處理指令的目標(biāo)可以是要使用的程序的名字,或者是一個類似于xml-stylesheet這樣的很多程序可以識別的通用標(biāo)識符。不同的應(yīng)用程序支持不同的處理指令,對于不認(rèn)識的處理指令,大多數(shù)應(yīng)用程序采取忽略的方式進行處理。
xml-stylesheet處理指令總是放在XML聲明之后,第一個元素之前。其它的處理指令可以放在除了標(biāo)記的內(nèi)部和XML聲明之前的任何位置。
要注意,雖然XML聲明和處理指令的語法形式相似,但XML聲明并不是處理指令,XML處理程序?qū)ML聲明和處理指令采取的是不同的處理方式。
本章學(xué)習(xí)到此為止,下一章學(xué)習(xí)如何編寫DTD。