ML即為可擴充套件的標記語言(eXtensible Markup Language)。XML是一套定義語義標記的 規則,這些標記將文件分成許多部件並對這些部件加以標識。
什麼是XML
XML是標記語言。理解XML,首先要理解標記。先說說HTML的標記(Markup),通俗地講,它 就是一種用來給文字新增標記的語言。在HTML裡每個標誌都是有確切含義的。例如,在HTML 中,標籤〈B〉的含義是要求HTML瀏覽器將一段文字加粗表示,而標籤〈CENTER〉的含義是告 訴瀏 覽器將這段文字在一行的中間顯示。
而XML並非象HTML那樣,提供了一組事先已經定義好了的標籤,而是提供了一個標準,利用這 個標準,你可以根據實際需要定義自己的新的置標語言,併為你的這個置標語言規定它特有 的一套標籤。準確的說,XML是一種源置標語言,它允許你根據它所提供的規則,制定各種 各樣的置標語言。
XML的產生
XML有兩個先驅——SGML和HTML,這兩個語言都是非常成功的標記語言,SGML的全稱是 標準通用化標記語言,它從80年代初開始使用。正如XML一樣,SGML也可用於建立成千 上萬的標記語言,它為語法置標提供了異常強大的工具,同時具有極好的擴充套件性,因此 在分類和索引資料中非常有用。目前,SGML多用於科技文獻和政府辦公檔案中。SGML 非常之複雜,其複雜程度對於網路上的日常應用簡直不可思議。不僅如此,SGML非常昂 貴。HTML免費、簡單,而且它獲得了廣泛的支援。它是一個非常簡單的SGML語言,可以 方便普通人的使用。1996年人們開始致力於描述一個置標語言,它既具有SGML的強大功 能和可擴充套件性,同時又具有HTML的簡單性。W3C於1998年2月批准了XML的1.0版本,一 個嶄新而大有前途的語言誕生了。
XML的優點
允許各種不同的專業(如音樂、化學、數學等)開發與自己的特定領域有關的標記 語言。這就使得該領域中的人們可以交換筆記、資料和資訊,而不用擔心接收端的人是否 有特定的軟體來建立資料。
具有較好的保值性.過去40年來的大多數計算機資料都丟失了,不是因為自然損害或 是備份介質的磨損,而只是因為沒有人來寫出如何讀取這些資料介質和格式的文件。以不常 用的格式儲存的二進位制資料,資料也許會永遠地消失了。XML在基本水平上使用的是非常簡 單的資料格式。可以用100%的純ASCII文字來書寫,也可以用幾種其他定義好的格式來書 寫。ASCII文字是幾乎不會"磨損"的。
3.應用間交換資料.由於XML是非專有的並易於閱讀和編寫,就使得它成為在不同的應用間交 換資料的理想格式使用的是非專有的格式,不受版權、專利、商業祕密或是其他種類的 智慧財產權的限制。XML的功能是非常強大的,同時對於人類或是計算機程式來說,都容易閱 讀和編寫。因而成為交換語言的首選。
此外,相對於HTML,XML具有先天的優越性。
為了自己的瀏覽器增加一些特殊的顯示效果,HTML加入了一些特殊的標記。日益增多的標籤 不但使HTML越來越龐大,瀏覽器的開發越來越複雜,還降低了不同瀏覽器之間的相容性。 儘管HTML的標籤越來越多,其顯示力卻還遠遠不夠。如果你希望非常精確地表現一些你自 己的資料,可能你需要一些現在在HTML中尚不存在的標籤。現在HTML內部結構的條理性越 來越差。你寫的HTML檔案,甚至是那些專門的所見即所得工具自動生成的HTML檔案,可能 在語法上會錯誤百出,不過沒關係,瀏覽器照樣能讀它。
現在有了XML,你終於可以自由地制定你自己的置標語言,而不必再念念不忘微軟、 Netscape、W3C的首肯了。實際上,現在許多行業、機構都利用XML定義了自己的置標語 言。比較早而且比較典型的是下面兩個例項:
化學置標語言CML (Chemistry Markup Language)數學置標語言MathML (Mathematical Markup Language)一個簡單的XML文件
現在讓我們考察一個簡單的XML文件:
Hello XML!
第一行是XML宣告:
這是XML處理指令的例子。處理指令以結束。在
XML宣告有version和standalone兩個特性。特性是由等號分開的名稱-數值對。位於等號 左邊的是特性名,而其值位於等號的右邊,並用雙引號括起來。每一個XML文件都以一個XML 宣告開始,用以指明所用的XML的版本。在上例中, version特性表明這個文件符合XML 1.0 規範。XML宣告還可以有standalone特性,這告訴我們文件是否在這一個檔案裡還是需要從外 部匯入檔案。在本例中,以及在以後的幾章中,所有的文件都在一個檔案裡完成,因而 standalone特性的值要設定為yes。
再看剩下三行。總體上說,這三行組成了FOO元素。分開說,是開始標記,而 是結束標記,Hello XML!是FOO元素的內容。讀者可能要問,標記的意義是什麼? 回答是"你要讓它是什麼就是什麼"。除了幾百個預定義的標記之外,XML還允許使用者建立 所需的標記。因而標記可以具有使用者賦於的任何意義.同一個XML文件可以用不同的 標記名編寫,如:
Hello XML!
或是:
Hello XML!
XML標記的意義
標記有三類意義:結構、語義和樣式。結構將文件分成元素樹。語義將單個的元素與 外部的實際事物聯絡起來。而樣式指定如何顯示元素。
結構只是表達文件的形式,而不管單個標記和元素間的差別。它們都指定文件具有一個 非空的基本元素。標記的不同名稱沒有結構上的意義。語義的意義存在於文件之外,在 作者的心中或是讀者或是某些生成或讀取這些檔案的計算機程式中。例如,理解HTML但 不理解XML的Web瀏覽器,可能會將段落的意義賦給
和
標記。講英語的人可能會 比和或
或
更容易理解和或是 和的意義。
正如"美麗"的意義存在於觀察者心中。自然地,使標記的名稱能夠儘可能反映其包含的意 義更好一些。許多學科,如數學和化學正在建立該學科的工業標準和標記集。
可以與標記相聯絡的第三類意義是樣式意義。樣式意義指定標記的內容如何在計算機螢幕 上或是其他輸出裝置上展示。樣式意義說明特定的元素是否是用粗體、斜體、綠色的`24磅 的字型還是其他字型加以表示。計算機在理解樣式時比理解語義意義要好一些。在XML中, 樣式意義是通過樣式單來施加的。(以後將會提到)
XML檔案的整體結構
xml檔案包括三部分:XML宣告、處理指示(可選)、XML元素。XML文件的一個基本 要求是形式良好的(well formed),一個形式良好的XML文件要包含這三個部分。
下面是一個完整的xml文件(程式1.1):
<學生花名冊>
<學生>
<名字>李華
<籍貫>河北
<年齡>15
<電話號碼>62875555
<學生>
<名字>張三
<籍貫>北京
<年齡>14
<電話號碼>82873425
處理指示
處理指示是用來給處理XML檔案的應用程式提供資訊的。所有的處理指示應該遵循 下面的格式:
例如這個處理指示:
指定與了XML檔案配套使用的樣式單的型別為xsl及檔名為:
XML檔案的實質內容——元素
元素是XML檔案內容的基本單元。從語法上講,一個元素包含一個起始標記、 一個結束標記以及標記之間的資料內容。其形式是:
<標記>資料內容
另外,元素中還可以再巢狀別的元素。比如資料內容可再擴充套件為
<標記1>資料內容1
<標記2>資料內容2
...
<標記n>資料內容1
元素裡還可以再巢狀元素,實現迴圈巢狀。最外層的元素稱為根元素。一個xml文件 只能有一個根元素。
字元資料與實體引用
一對標記之間出現的字元資料可以是任何合法的UNICODE字元,但不能包含字元"〈"。 這是因為,字元"〈"被預留用作標記的開始符。
在XML中,起始和結束標記之間出現的所有合法字元都被忠實地傳給XML處理程式。 為了避免把字元資料和標記中需要用到的一些特殊符號相混淆,XML還提供了一些有用的 實體引用。實體引用的作用是,當在字元資料中需要使用這些特殊符號時,我們採用它的 實體引用來代替。這些特殊的XML實體引用包括:
> >
< <
& &
" "
’ '
這樣,如果我們需要在"示例"這個標記中出現文字
"<姓名>張三"
正確的寫法應該是:
〈示例〉<姓名>張三〈/示例〉
容易理解,字元"〈"的實體引用是必不可少的,為"〉"設立實體引用同樣是為了避免與 標記混淆,而字元"&"的實體引用則防止它與實體引用中開頭所用的"&"相混淆。那麼, 我們什麼時候需要用到剩下兩個字元的實體引用呢?在標記中可以為標記設立屬性, 而XML規定屬性值必須用"""括起來。因此,當屬性值中出現字元"""時,需要將它 用實體引用代替。請看下面的例子:
正確的寫法應該是:
標記
正如我們開篇所講,標記是XML語言的精髓。因此,標記在XML的元素中、乃至整個XML 檔案中,佔了舉足輕重的位置。
XML的標記和HTML的標記在模樣上大體相同,除了註釋和CDATA部分以外,所有符號〈 和符號〉之間的內容都稱為標記。其基本形式為:
〈標記名 (屬性名="屬性取值")*〉
不過,XML對於標記的語法規定可比HTML要嚴格得多。
大小寫有所區分
在標記中必須注意區分大小寫。在HTML中,標記〈HELLO〉和〈hello〉是一回事,但 在XML中,它們是兩個截然不同的標記。
要有正確的結束標記
結束標記除了要和開始標記在拼寫和大小寫上完全相同,還必須在前面加上一個斜槓 "/"。因此,如果開始標記是〈HELLO〉,結束標記應該寫作〈/HELLO〉。XML嚴格 要求標記配對,因此,HTML中的、
的元素形式在XML中是不合法的。不過, 為了簡便起見,當一對標記之間沒有任何文字內容時,可以不寫結束標記,而在開始 標記的最後慣以斜槓"/"來確認。這樣的標記稱為"空標記"。例如,HTML中的標記 〈HR〉在XML中的使用方式應該是:。
標記要正確巢狀
在一個XML元素中允許包含其它XML元素,但這些元素之間必須滿足巢狀性。
有效使用屬性
最後要指出的是,標記中可以包含任意多個屬性。在標記中,屬性以名稱/取值對出現, 屬性名不能重複,名稱與取值之間用等號"="分隔,且取值用引號引起來。例如:
<商品 型別 = "服裝" 顏色 = "黃色">
在這個例子中,"型別"和"顏色"是標記"商品"的屬性,"服裝"是屬性"型別"的 取值,"黃色"是屬性"顏色"的取值。
需要特別注意的是,在XML中屬性的取值必須用引號引起來,而在HTML中這一點並不 嚴格要求。
CDATA
正象我們前面所說,我們可以把XML檔案中除標記以外的所有內容都看作是字元 資料,而把標記中的所有內容都看作置標。不過,也有一個例外。在一個特殊的 標記CDATA下,所有的標記、實體引用都被忽略,而被XML處理程式一視同仁地 當作字元資料看待。CDATA的形式如下:
〈![CDATA[
文字內容
]]〉
聰明的讀者可能已經猜出,CDATA的文字內容中是不能出現字串"]]〉"的, 因為它代表了CDATA資料塊的結束標誌。
在前面講字元資料時,我們談到過實體引用。可想而知,當你的文字資料中包含 大量特殊符號時,你不得不通篇地使用實體引用,把本來很清晰的一段文字搞得 亂七八糟。例如,我們要在"示例"元素中放入了一個這麼XML程式。
<聯絡人>
<姓名>張三
這時,如果沒有CDATA,那麼麻煩來了。這個元素需要寫成下面的樣子:
<示例>
<聯絡人>
<姓名>張三
哇,你要把所有的標記都用實體引用改寫,最後寫出來的東西連你自己都看不懂了。 為了避免這種不便,你可以把這些字元資料放在一個CDATA資料塊中,這樣不管它 看上去是一個標記還是一個實體引用,這些資料統統被當作字元照單全收。於是, 上面的元素就可以寫為這個樣子:
<示例>
<聯絡人>
<姓名>張三
]]〉
〈/示例〉
清楚多了吧!
註釋
象前一節的例子中那樣,有些時候,你希望XML處理器能夠把你在資料中引入的 標記當作普通資料而不是真正的標記來看待。這時,CDATA為你助了一臂之力。 另外還有些時候,就象在程式中引入註釋一樣,你可能希望在XML檔案中加入一 些用作解釋的字元資料,並且希望XML處理器不對它們進行任何處理。這種型別 的文字稱作註釋(COMMENT)文字。
在HTML中,註釋是用"〈!--"和"--〉"引起來的。在XML中,註釋的方法完全 相同。因此,下面是一個合法的XML(但不是形式良好的)檔案: <示例>
<聯絡人>
<姓名>張三
]]>
不過,在XML檔案中使用註釋時,同樣要遵守幾個規則:
在註釋文字中不能出現字元"-"或字串"--",XML處理器可能把它們和註釋結尾 標誌"-->"相混淆。
不要把註釋文字放在標記之中。類似地,不要把註釋文字放在實體宣告中,也不要 放在XML宣告之前。記住,永遠用XML宣告作為XML檔案中的第一行。
註釋不能被巢狀。在使用一對註釋符號表示註釋文字時,要保證其中不再包含另一 對註釋符號。例如下面例子是不合法的:
-->
最後再重申一遍,XML處理器對於註釋中的一切內容都會視而不見,註釋中出現的 標記也一同被忽略。
形式良好的XML
為了使一個文件"形式良好",XML文件中的所有置標和字元資料必須遵守前幾節中給出 的規則。而且有幾條關於如何把置標和字元資料相互聯絡起來的規則。 這些規則總結如下:
文件的開始必須是XML宣告。
含有資料的元素必須有起始標記和結束標記。
不含資料並且僅使用一個標記的元素必須以/>結束。
文件只能包含一個能夠包含全部其他元素的元素。
元素只能巢狀不能重疊。
屬性值必須加引號。
字元<和&只能用於起始標記和實體引用。
出現的實體引用只有&、<、>、'和"。