什麼是XML
XML即為可擴展的標記語言(eXtensible Markup Language)。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的優點
1.XML允許各種不同的專業(如音樂、化學、數學等)開發與自己的特定領域有關的標記語言。這就使得該領域中的人們可以交換筆記、數據和信息,而不用擔心接收端的人是否有特定的軟件來創建數據。
2.XML具有較好的保值性.過去40年來的大多數計算機數據都丟失了,不是因為自然損害或是備份介質的磨損,而只是因為沒有人來寫出如何讀取這些數據介質和格式的文檔。以不常用的格式保存的二進制數據,數據也許會永遠地消失了。XML在基本水平上使用的是非常簡單的數據格式。可以用100%的純ASCII文本來書寫,也可以用幾種其他定義好的格式來書寫。ASCII文本是幾乎不會"磨損"的。
3.應用間交換數據.由於XML是非專有的並易於閱讀和編寫,就使得它成為在不同的應用間交換數據的理想格式.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文檔:
<?XML version="1.0" standalone="yes"?>
<FOO>
Hello XML!
</FOO>
第一行是XML聲明:
<?XML version="1.0" standalone="yes"?>
這是XML處理指令的例子。處理指令以<?開始,而以?>結束。在<?後的第一個單詞是處理指令名,在本例中是XML。
XML聲明有version和standalone兩個特性。特性是由等號分開的名稱-數值對。位於等號左邊的是特性名,而其值位於等號的右邊,並用雙引號括起來。每一個XML文檔都以一個XML 聲明開始,用以指明所用的XML的版本。在上例中, version特性表明這個文檔符合XML 1.0 規范。XML聲明還可以有standalone特性,這告訴我們文檔是否在這一個文件裡還是需要從外部導入文件。在本例中,以及在以後的幾章中,所有的文檔都在一個文件裡完成,因而 standalone特性的值要設置為yes。
再看剩下三行。總體上說,這三行組成了FOO元素。分開說,<FOO>是開始標記,而</FOO> 是結束標記,Hello XML!是FOO元素的內容。讀者可能要問,<FOO>標記的意義是什麼?回答是"你要讓它是什麼就是什麼"。除了幾百個預定義的標記之外,XML還允許用戶創建所需的標記。因而<FOO>標記可以具有用戶賦於的任何意義.同一個XML文檔可以用不同的標記名編寫,如:
<?XML version="1.0" standalone="yes"?>
<GREETING>
Hello XML!
</GREETING>
或是:
<?XML version="1.0" standalone="yes"?>
<P>
Hello XML!
</P>
XML標記的意義
標記有三類意義:結構、語義和樣式。結構將文檔分成元素樹。語義將單個的元素與外部的實際事物聯系起來。而樣式指定如何顯示元素。
結構只是表達文檔的形式,而不管單個標記和元素間的差別。它們都指定文檔具有一個非空的基本元素。標記的不同名稱沒有結構上的意義。語義的意義存在於文檔之外,在作者的心中或是讀者或是某些生成或讀取這些文件的計算機程序中。例如,理解Html但不理解XML的Web浏覽器,可能會將段落的意義賦給<P>和</P>標記。講英語的人可能會比<FOO>和</FOO>或<P>或</P>更容易理解<GREETING>和</GREETING>或是 <DOCUMENT>和</DOCUMENT>的意義。
正如"美麗"的意義存在於觀察者心中。自然地,使標記的名稱能夠盡可能反映其包含的意義更好一些。許多學科,如數學和化學正在創建該學科的工業標准和標記集。
可以與標記相聯系的第三類意義是樣式意義。樣式意義指定標記的內容如何在計算機屏幕上或是其他輸出設備上展示。樣式意義說明特定的元素是否是用粗體、斜體、綠色的24磅的字體還是其他字體加以表示。計算機在理解樣式時比理解語義意義要好一些。在XML中,樣式意義是通過樣式單來施加的。(以後將會提到)
XML文件的整體結構
xml文件包括三部分:XML聲明、處理指示(可選)、XML元素。XML文檔的一個基本要求是形式良好的(well formed),一個形式良好的XML文檔要包含這三個部分。
下面是一個完整的XML文檔(程序1.1):
<?XML version="1.0" encoding="gb2312" ?>
<?XML-stylesheet type="text/xsl" href="mystyle.xsl"?>
<學生花名冊>
<學生>
<名字>李華</名字>
<籍貫>河北</籍貫>
<年齡>15</年齡>
<電話號碼>62875555</電話號碼>
</學生>
<學生>
<名字>張三</名字>
<籍貫>北京</籍貫>
<年齡>14</年齡>
<電話號碼>82873425</電話號碼>
</學生>
</學生花名冊>
處理指示
處理指示是用來給處理XML文件的應用程序提供信息的。所有的處理指示應該遵循下面的格式:
<?處理指示名 處理指示信息?>
例如這個處理指示:
<?XML-stylesheet type="text/xsl" href="mystyle.xsl"?>
指定與了XML文件配套使用的樣式單的類型為xsl及文件名為mystyle.xsl:
XML文件的實質內容——元素
元素是XML文件內容的基本單元。從語法上講,一個元素包含一個起始標記、一個結束標記以及標記之間的數據內容。其形式是:
<標記>數據內容</標記>
另外,元素中還可以再嵌套別的元素。比如數據內容可再擴展為
<標記1>數據內容1</標記1>
<標記2>數據內容2</標記2>
...
<標記n>數據內容1</標記n>
元素裡還可以再嵌套元素,實現循環嵌套。最外層的元素稱為根元素。一個XML文檔只能有一個根元素。
字符數據與實體引用
一對標記之間出現的字符數據可以是任何合法的UNICODE字符,但不能包含字符"〈"。這是因為,字符"〈"被預留用作標記的開始符。
在XML中,起始和結束標記之間出現的所有合法字符都被忠實地傳給XML處理程序。為了避免把字符數據和標記中需要用到的一些特殊符號相混淆,XML還提供了一些有用的實體引用。實體引用的作用是,當在字符數據中需要使用這些特殊符號時,我們采用它的實體引用來代替。這些特殊的XML實體引用包括:
> >
< <
& &
" "
’ '
這樣,如果我們需要在"示例"這個標記中出現文本
"<姓名>張三</姓名>"
正確的寫法應該是:
〈示例〉<姓名>張三</姓名>〈/示例〉
容易理解,字符"〈"的實體引用是必不可少的,為"〉"設立實體引用同樣是為了避免與標記混淆,而字符"&"的實體引用則防止它與實體引用中開頭所用的"&"相混淆。那麼,我們什麼時候需要用到剩下兩個字符的實體引用呢?在標記中可以為標記設立屬性,而XML規定屬性值必須用"""括起來。因此,當屬性值中出現字符"""時,需要將它用實體引用代替。請看下面的例子:
<STATEMENT VALUE = "She said, "Don t go there!"">
正確的寫法應該是:
<STATEMENT VALUE = "She said, "Don't go there!"">
標記
正如我們開篇所講,標記是XML語言的精髓。因此,標記在XML的元素中、乃至整個XML 文件中,占了舉足輕重的位置。
XML的標記和Html的標記在模樣上大體相同,除了注釋和CDATA部分以外,所有符號〈和符號〉之間的內容都稱為標記。其基本形式為:
〈標記名 (屬性名="屬性取值")*〉
不過,XML對於標記的語法規定可比Html要嚴格得多。
大小寫有所區分
在標記中必須注意區分大小寫。在Html中,標記〈HELLO〉和〈hello〉是一回事,但在XML中,它們是兩個截然不同的標記。
要有正確的結束標記
結束標記除了要和開始標記在拼寫和大小寫上完全相同,還必須在前面加上一個斜槓 "/"。因此,如果開始標記是〈HELLO〉,結束標記應該寫作〈/HELLO〉。XML嚴格要求標記配對,因此,HTML中的<BR>、<HR>的元素形式在XML中是不合法的。不過,為了簡便起見,當一對標記之間沒有任何文本內容時,可以不寫結束標記,而在開始標記的最後慣以斜槓"/"來確認。這樣的標記稱為"空標記"。例如,Html中的標記〈HR〉在XML中的使用方式應該是:<HR/>。
標記要正確嵌套
在一個XML元素中允許包含其它XML元素,但這些元素之間必須滿足嵌套性。
有效使用屬性
最後要指出的是,標記中可以包含任意多個屬性。在標記中,屬性以名稱/取值對出現,屬性名不能重復,名稱與取值之間用等號"="分隔,且取值用引號引起來。例如:<商品 類型 = "服裝" 顏色 = "黃色">
在這個例子中,"類型"和"顏色"是標記"商品"的屬性,"服裝"是屬性"類型"的取值,"黃色"是屬性"顏色"的取值。
需要特別注意的是,在XML中屬性的取值必須用引號引起來,而在Html中這一點並不嚴格要求。
CDATA
正象我們前面所說,我們可以把XML文件中除標記以外的所有內容都看作是字符數據,而把標記中的所有內容都看作置標。不過,也有一個例外。在一個特殊的標記CDATA下,所有的標記、實體引用都被忽略,而被XML處理程序一視同仁地當作字符數據看待。CDATA的形式如下:
〈![CDATA[
文本內容
]]〉
聰明的讀者可能已經猜出,CDATA的文本內容中是不能出現字符串"]]〉"的,因為它代表了CDATA數據塊的結束標志。
在前面講字符數據時,我們談到過實體引用。可想而知,當你的文本數據中包含大量特殊符號時,你不得不通篇地使用實體引用,把本來很清晰的一段文字搞得亂七八糟。例如,我們要在"示例"元素中放入了一個這麼XML程序。
<聯系人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯系人>
這時,如果沒有CDATA,那麼麻煩來了。這個元素需要寫成下面的樣子:
<示例>
<聯系人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯系人>
</示例>
哇,你要把所有的標記都用實體引用改寫,最後寫出來的東西連你自己都看不懂了。為了避免這種不便,你可以把這些字符數據放在一個CDATA數據塊中,這樣不管它看上去是一個標記還是一個實體引用,這些數據統統被當作字符照單全收。於是,上面的元素就可以寫為這個樣子:
<示例>
<![CDATA[
<聯系人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯系人>
]]〉
〈/示例〉
清楚多了吧!
注釋
<p>象前一節的例子中那樣,有些時候,你希望XML處理器能夠把你在數據中引入的標記當作普通數據而不是真正的標記來看待。這時,CDATA為你助了一臂之力。另外還有些時候,就象在程序中引入注釋一樣,你可能希望在XML文件中加入一些用作解釋的字符數據,並且希望XML處理器不對它們進行任何處理。這種類型的文本稱作注釋(COMMENT)文本。</p>
在Html中,注釋是用"〈!--"和"--〉"引起來的。在XML中,注釋的方法完全相同。因此,下面是一個合法的XML(但不是形式良好的)文件: <示例>
<!-- 一個XML的例子 -->
<![CDATA[
<聯系人>
<姓名>張三</姓名>
<EMAIL>zhang@aaa.com</EMAIL>
</聯系人>
]]>
</示例>
不過,在XML文件中使用注釋時,同樣要遵守幾個規則:
在注釋文本中不能出現字符"-"或字符串"--",XML處理器可能把它們和注釋結尾標志"-->"相混淆。
不要把注釋文本放在標記之中。類似地,不要把注釋文本放在實體聲明中,也不要放在XML聲明之前。記住,永遠用XML聲明作為XML文件中的第一行。
注釋不能被嵌套。在使用一對注釋符號表示注釋文本時,要保證其中不再包含另一對注釋符號。例如下面例子是不合法的:
<!-- 一個XML的例子
<!--以上是一個注釋-->
-->
最後再重申一遍,XML處理器對於注釋中的一切內容都會視而不見,注釋中出現的標記也一同被忽略。
形式良好的XML
為了使一個文檔"形式良好",XML文檔中的所有置標和字符數據必須遵守前幾節中給出的規則。而且有幾條關於如何把置標和字符數據相互聯系起來的規則。這些規則總結如下:
文檔的開始必須是XML聲明。
含有數據的元素必須有起始標記和結束標記。
不含數據並且僅使用一個標記的元素必須以/>結束。
文檔只能包含一個能夠包含全部其他元素的元素。
元素只能嵌套不能重疊。
屬性值必須加引號。
字符<和&只能用於起始標記和實體引用。
出現的實體引用只有&、<、>、'和"。