(本系列文章是我學(xué)習(xí)的過(guò)程中,整理出來(lái)的筆記,如有錯(cuò)漏,看官請(qǐng)一定不吝回復(fù),讓我能認(rèn)識(shí)自己的不足,并改進(jìn)錯(cuò)誤。非常感謝?。?/span>

推薦一個(gè)XML編輯工具,強(qiáng)大的XMLSpy,我用的是2008版。

    XML文檔的結(jié)構(gòu)可以從物理和邏輯兩方面來(lái)看。
    一、從物理上而言,文檔由稱為實(shí)體(entities)的存儲(chǔ)單元組成,實(shí)體都是具有內(nèi)容并且都通過(guò)實(shí)體的名字進(jìn)行標(biāo)識(shí)(文檔實(shí)體和外部DTD子集除外)。實(shí)體可以是一段文本,一個(gè)文件,一個(gè)數(shù)據(jù)庫(kù)記錄或者其他包含數(shù)據(jù)的項(xiàng)目,一個(gè)實(shí)體可以引用其它的實(shí)體,從而將它們包含在文檔中。文檔開(kāi)始于“根(root)”或者文檔實(shí)體(document entity)。格式良好的XML文檔形成了一種層次樹(shù)結(jié)構(gòu),這個(gè)樹(shù)結(jié)構(gòu)的樹(shù)根就是文檔實(shí)體,與其它實(shí)體不同,文檔實(shí)體沒(méi)有名字,只是用于表示文檔樹(shù)的根。XML文檔的根元素被稱位文檔元素(document element),它和在其外部出現(xiàn)的處理指令,注釋等作為文檔實(shí)體的子節(jié)點(diǎn),而根元素本身和其內(nèi)部的子元素也是一棵樹(shù)。

    實(shí)體可以包含已分析(parsed)的或未分析的(unparsed)數(shù)據(jù)。已分析的數(shù)據(jù)由字符組成,其中一些字符組成字符數(shù)據(jù),另一些字符組成標(biāo)記。已分析的實(shí)體(parsed entity)內(nèi)容被成為它的代替文本,這個(gè)文本被看稱是文檔整體的一部分,在XML處理器分析XML文檔時(shí),凡是文檔中出現(xiàn)引用已分析實(shí)體的地方,都將被該實(shí)體的內(nèi)容所替換。未分析的實(shí)體(unparsed entity)是一種資源,它的內(nèi)容可以是也可以不是文本,并且,如果是文本的話,可以不是XML文本,每一個(gè)未分析的實(shí)體有一個(gè)相關(guān)聯(lián)的用名字標(biāo)識(shí)的記號(hào)(notation)。除了要求XML處理器能向應(yīng)用程序提供可用的實(shí)體和記號(hào)的標(biāo)志符之外,XML對(duì)未分析的的實(shí)體內(nèi)容不做任何限制。已分析的實(shí)體以實(shí)體引用的方式通過(guò)名字來(lái)調(diào)用,未分析的實(shí)體通過(guò)ENTITY或ENTITIES屬性中給出的名字來(lái)調(diào)用。

    二、邏輯上而言,文檔由聲明,元素,注釋,字符引用和處理指令組成,在文檔中,所有這些都是通過(guò)顯式的標(biāo)記(markup)來(lái)指明的。XML標(biāo)記(markup)包括開(kāi)始標(biāo)簽(tag)、結(jié)束標(biāo)簽、空元素標(biāo)簽、實(shí)體引用、字符引用、注釋、CDATA段定界符、文檔類型聲明、處理指令、XML聲明、文本聲明以及任何在文檔實(shí)體頂層的空白(即,在文檔元素之外,且不在任何其它的標(biāo)記內(nèi)部)。
其它所有非標(biāo)記的文本組成文檔的字符數(shù)據(jù)。
    XML文檔在邏輯上主要由以下五個(gè)部分組成:
    1、XML聲明
    2、文檔類型聲明
    3、元素
    4、注釋
    5、處理指令

下面具體介紹XML文檔邏輯上的五個(gè)部分。

1、XML聲明
XML文檔總是以一個(gè)XML聲明開(kāi)始的,其格式如下
    <?xml 版本信息 [編碼信息] [文檔獨(dú)立性信息]?>
其中,編碼信息和文檔獨(dú)立性信息可以不寫(xiě),而使用默認(rèn)值。

需要注意的是,XML聲明總是在XML文檔的最前面,其前面不能出現(xiàn)任何字符。

下面是幾個(gè)例子:

<?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"?>
<!--文檔獨(dú)立性信息聲明,如果文檔依賴于外部文檔,則需要將standalone屬性設(shè)置為"no"-->


2、文檔類型聲明

DTD(Document Type Definition),文檔類型定義。

首先提一個(gè)問(wèn)題,如果你的一個(gè)XML文檔給別人使用,別人怎么才能正確地定義XML文檔中的元素,屬性呢?就好像我們用Struts時(shí),我們需要配置struts-config.xml,但是怎么保證我們的配置是正確的?答案就是用DTD來(lái)驗(yàn)證。

一個(gè)遵循XML語(yǔ)法規(guī)則,并遵守相應(yīng)DTD文件約束的XML文檔稱為有效的XML文檔。

XML從SGML繼承了用于定義語(yǔ)法規(guī)則的DTD機(jī)制,DTD文件本身是不需要遵循XML規(guī)則的。大部分的XML應(yīng)用都是使用DTD來(lái)定義的(還有一部分是用XML Schema來(lái)定義的,XML Schema在其專題中學(xué)習(xí))。HTML就有一個(gè)標(biāo)準(zhǔn)的DTD文件,所以其組織結(jié)構(gòu)和所有的標(biāo)簽都是固定的,DTD文件本身也是一個(gè)文本文件,通常用".DTD"為其擴(kuò)展名。

文檔類型聲明的作用就是指出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>
    <!--因?yàn)镈TD中定義了Name,Office兩個(gè)元素的順序,Office元素不能放在Name元素的前面,否則不是有效的XML文檔-->
</OrganizationChart>

另一種是在一個(gè)外部文件定義的DTD文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
    
<Name>Toone,INC.</Name>
    
<Office>zhuhai</Office>
</OrganizationChart>
對(duì)應(yīng)DTD文件dtdTest.dtd內(nèi)容為:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>


3、元素

在XML中,元素由開(kāi)始標(biāo)簽、元素內(nèi)容和結(jié)束標(biāo)簽構(gòu)成,對(duì)于空元素,由空元素標(biāo)簽構(gòu)成。
每一個(gè)元素都有一個(gè)用名字標(biāo)識(shí)的類型,同時(shí)它可以由一個(gè)屬性說(shuō)明集,每一個(gè)屬性說(shuō)明有一個(gè)名字和一個(gè)值。
在給元素命名的時(shí)候要注意,以"xml"或其他任何匹配(('X'|'x')
 
('M'|'m' )('L'|'l' ))的字符串開(kāi)頭的名字,被保留用于XML規(guī)范的當(dāng)前版本或者后續(xù)版本的標(biāo)準(zhǔn)化。此外,在給元素命名時(shí),還要遵循下列規(guī)范:
    1、名字只能以字母、下劃線(_)或者冒號(hào)(:)開(kāi)頭;
    2、名字中可以包含字母、數(shù)字、下劃線以及其他在XML標(biāo)準(zhǔn)中允許的字符;
    3、名字中不能包含空格;
    4、名字中盡可能不要使用冒號(hào)(:),因?yàn)槊疤?hào)在名字空間中被用于分隔名字空間前綴和本地部分。

元素的四種形式:
    1、空元素
    2、帶有屬性的空元素
    3、帶有內(nèi)容的元素
    4、帶有內(nèi)容和屬性的元素

在一個(gè)元素的內(nèi)容中,字符數(shù)據(jù)可以是不包含任何標(biāo)記的起始定界符和CDATA段的定界符的任意字符串,也就是會(huì)所在元素的內(nèi)容中,字符數(shù)據(jù)不能有和號(hào)(&)和小于號(hào)(
<),也不能有字符串"]]>"。那么如果我們要用這些字符的話,必須用他們對(duì)應(yīng)的字符引用和實(shí)體引用來(lái)表示,見(jiàn)下表:

 元素內(nèi)容的字符引用和實(shí)體引用
 字符  字符引用
(十進(jìn)制代碼)
 字符引用
(十六進(jìn)制代碼)
預(yù)定義實(shí)體引用 
 < <
<
&lt;
>
>
>
&gt;
"


&quot;
'


&apos;
&


&amp;

CDATA段中包含的都是純字符數(shù)據(jù),在字符數(shù)據(jù)可以出現(xiàn)的任何地方都可以使用CDATA段。
CDATA段主要用于需要將整個(gè)文本解釋為字符數(shù)據(jù)而不是標(biāo)記的情況下。CDATA段中的內(nèi)容不被XML處理器分析,所以可以在其中包含任意的字符。


4、注釋

注釋用于對(duì)文檔中的內(nèi)容起到一個(gè)說(shuō)明作用。
在XML文檔中,注釋可以出現(xiàn)在文檔中其它表ijizhiwai的任何聞之,另外,它們還可以在人當(dāng)類型聲明中語(yǔ)法(grammar)允許的地方出現(xiàn)。
XML的注釋和HTML的注釋類似,都是以<!--開(kāi)始,以-->結(jié)束。位于<!--和-->之間的數(shù)據(jù)將被XML處理器忽略。
使用XML注釋需要注意一下五點(diǎn):
    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)用程序來(lái)處理的指令。在XML文檔中,有可能會(huì)包含一些非XML格式的數(shù)據(jù),這些數(shù)據(jù)XML處理器無(wú)法處理,我們可以通過(guò)處理指令來(lái)通知其它應(yīng)用程序來(lái)處理這些數(shù)據(jù)。
處理指令的語(yǔ)法和XML聲明類似,以<?開(kāi)始, 以?>結(jié)束。一個(gè)常見(jiàn)的使用樣式表單的處理指令如下所示:
<?xml-stylesheet href="style.css" type="text/css"?>

在開(kāi)始標(biāo)記<?后的第一個(gè)字符"xml-stylesheet"叫做處理指令的目標(biāo),它必須標(biāo)識(shí)要用到的應(yīng)用程序,要注意的是對(duì)于其它的非W3C定義的處理指令不能以字符串"XML"和"xml"開(kāi)頭;其余的部分是傳遞給應(yīng)用程序的字符數(shù)據(jù)。應(yīng)用程序從處理指令中取得目標(biāo)和數(shù)據(jù),執(zhí)行要求的動(dòng)作。

處理指令的目標(biāo)可以是要使用的程序的名字,或者是一個(gè)類似于xml-stylesheet這樣的很多程序可以識(shí)別的通用標(biāo)識(shí)符。不同的應(yīng)用程序支持不同的處理指令,對(duì)于不認(rèn)識(shí)的處理指令,大多數(shù)應(yīng)用程序采取忽略的方式進(jìn)行處理。

xml-stylesheet處理指令總是放在XML聲明之后,第一個(gè)元素之前。其它的處理指令可以放在除了標(biāo)記的內(nèi)部和XML聲明之前的任何位置。
要注意,雖然XML聲明和處理指令的語(yǔ)法形式相似,但XML聲明并不是處理指令,XML處理程序?qū)ML聲明和處理指令采取的是不同的處理方式。


本章學(xué)習(xí)到此為止,下一章學(xué)習(xí)如何編寫(xiě)DTD。