(本系列文章是我學習的過程中,整理出來的筆記,如有錯漏,看官請一定不吝回復,讓我能認識自己的不足,并改進錯誤。非常感謝!)

推薦一個XML編輯工具,強大的XMLSpy,我用的是2008版。

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

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

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

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

1、XML聲明
XML文檔總是以一個XML聲明開始的,其格式如下
    <?xml 版本信息 [編碼信息] [文檔獨立性信息]?>
其中,編碼信息和文檔獨立性信息可以不寫,而使用默認值。

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

下面是幾個例子:

<?xml version="1.0"?>
<!--版本信息聲明-->

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--編碼信息聲明.默認值是"UTF-8"-->

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--文檔獨立性信息聲明,如果文檔依賴于外部文檔,則需要將standalone屬性設置為"no"-->


2、文檔類型聲明

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

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

一個遵循XML語法規則,并遵守相應DTD文件約束的XML文檔稱為有效的XML文檔

XML從SGML繼承了用于定義語法規則的DTD機制,DTD文件本身是不需要遵循XML規則的。大部分的XML應用都是使用DTD來定義的(還有一部分是用XML Schema來定義的,XML Schema在其專題中學習)。HTML就有一個標準的DTD文件,所以其組織結構和所有的標簽都是固定的,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"?>
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
    
<Name>Toone,INC.</Name>
    
<Office>zhuhai</Office>
</OrganizationChart>
對應DTD文件dtdTest.dtd內容為:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>


3、元素

在XML中,元素由開始標簽、元素內容和結束標簽構成,對于空元素,由空元素標簽構成。
每一個元素都有一個用名字標識的類型,同時它可以由一個屬性說明集,每一個屬性說明有一個名字和一個值。
在給元素命名的時候要注意,以"xml"或其他任何匹配(('X'|'x')
 
('M'|'m' )('L'|'l' ))的字符串開頭的名字,被保留用于XML規范的當前版本或者后續版本的標準化。此外,在給元素命名時,還要遵循下列規范:
    1、名字只能以字母、下劃線(_)或者冒號(:)開頭;
    2、名字中可以包含字母、數字、下劃線以及其他在XML標準中允許的字符;
    3、名字中不能包含空格;
    4、名字中盡可能不要使用冒號(:),因為冒號在名字空間中被用于分隔名字空間前綴和本地部分。

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

在一個元素的內容中,字符數據可以是不包含任何標記的起始定界符和CDATA段的定界符的任意字符串,也就是會所在元素的內容中,字符數據不能有和號(&)和小于號(
<),也不能有字符串"]]>"。那么如果我們要用這些字符的話,必須用他們對應的字符引用和實體引用來表示,見下表:

 元素內容的字符引用和實體引用
 字符  字符引用
(十進制代碼)
 字符引用
(十六進制代碼)
預定義實體引用 
 < <
<
&lt;
>
>
>
&gt;
"


&quot;
'


&apos;
&


&amp;

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


4、注釋

注釋用于對文檔中的內容起到一個說明作用。
在XML文檔中,注釋可以出現在文檔中其它表ijizhiwai的任何聞之,另外,它們還可以在人當類型聲明中語法(grammar)允許的地方出現。
XML的注釋和HTML的注釋類似,都是以<!--開始,以-->結束。位于<!--和-->之間的數據將被XML處理器忽略。
使用XML注釋需要注意一下五點:
    1、注釋不能出現在XML聲明之前,XML聲明必須是文檔最前面的部分。下面的情況是不允許的:
<!--Author:Jason Chen-->
<?xml version="1.0"?>

    2、注釋不能出現在標記中,下面的例子是非法的:
<author<!--This document author-->>Jason Chen</author>

    3、注釋可以包圍和隱藏標記,但是要注意,在注釋掉標記以后,要保持文檔的完整結構。
    4、字符串"--"(雙連字符)不能出現在注釋中。

5、處理指令

處理指令(Processing Instructions)允許文檔中包含由應用程序來處理的指令。在XML文檔中,有可能會包含一些非XML格式的數據,這些數據XML處理器無法處理,我們可以通過處理指令來通知其它應用程序來處理這些數據。
處理指令的語法和XML聲明類似,以<?開始, 以?>結束。一個常見的使用樣式表單的處理指令如下所示:
<?xml-stylesheet href="style.css" type="text/css"?>

在開始標記<?后的第一個字符"xml-stylesheet"叫做處理指令的目標,它必須標識要用到的應用程序,要注意的是對于其它的非W3C定義的處理指令不能以字符串"XML"和"xml"開頭;其余的部分是傳遞給應用程序的字符數據。應用程序從處理指令中取得目標和數據,執行要求的動作。

處理指令的目標可以是要使用的程序的名字,或者是一個類似于xml-stylesheet這樣的很多程序可以識別的通用標識符。不同的應用程序支持不同的處理指令,對于不認識的處理指令,大多數應用程序采取忽略的方式進行處理。

xml-stylesheet處理指令總是放在XML聲明之后,第一個元素之前。其它的處理指令可以放在除了標記的內部和XML聲明之前的任何位置。
要注意,雖然XML聲明和處理指令的語法形式相似,但XML聲明并不是處理指令,XML處理程序對XML聲明和處理指令采取的是不同的處理方式。


本章學習到此為止,下一章學習如何編寫DTD。