█XML是eXtensible Markup Language的縮寫。擴(kuò)展標(biāo)記語言XML是一種簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)語言,使用一系列簡(jiǎn)單的標(biāo)記描述數(shù)據(jù),而這些標(biāo)記可以用方便的方式建立,雖然XML占用的空間比二進(jìn)制數(shù)據(jù)要占用更多的空間,但XML極其簡(jiǎn)單易于掌握和使用。
XML與Access,Oracle和SQL Server等數(shù)據(jù)庫不同,數(shù)據(jù)庫提供了更強(qiáng)有力的數(shù)據(jù)存儲(chǔ)和分析能力,例如:數(shù)據(jù)索引、排序、查找、相關(guān)一致性等,XML僅僅是展示數(shù)據(jù)。事實(shí)上XML與其他數(shù)據(jù)表現(xiàn)形式最大的不同是:他極其簡(jiǎn)單。這是一個(gè)看上去有點(diǎn)瑣細(xì)的優(yōu)點(diǎn),但正是這點(diǎn)使XML與眾不同。
XML的簡(jiǎn)單使其易于在任何應(yīng)用程序中讀寫數(shù)據(jù),這使XML很快成為數(shù)據(jù)交換的唯一公共語言,雖然不同的應(yīng)用軟件也支持其它的數(shù)據(jù)交換格式,但不久之后他們都將支持XML,那就意味著程序可以更容易的與Windows、Mac OS, Linux以及其他平臺(tái)下產(chǎn)生的信息結(jié)合,然后可以很容易加載XML數(shù)據(jù)到程序中并分析他,并以XML格式輸出結(jié)果。
XML的前身是SGML(The Standard Generalized Markup Language),是自IBM從60年代就開始發(fā)展的GML(Generalized Markup Language)
同HTML一樣, XML (可擴(kuò)展標(biāo)識(shí)語言)是通用標(biāo)識(shí)語言標(biāo)準(zhǔn)(SGML)的一個(gè)子集,它是描述網(wǎng)絡(luò)上的數(shù)據(jù)內(nèi)容和結(jié)構(gòu)的標(biāo)準(zhǔn)。盡管如此,XML不象HTML,HTML僅僅提供了在頁面上顯示信息的通用方法(沒有上下文相關(guān)和動(dòng)態(tài)功能) ,XML則對(duì)數(shù)據(jù)賦予上下文相關(guān)功能,它繼承了SGML的大部分功能,卻使用了不太復(fù)雜的技術(shù)。.
為了使得SGML顯得用戶友好,XML重新定義了SGML的一些內(nèi)部值和參數(shù),去掉了大量的很少用到的功能,這些繁雜的功能使得SGML在設(shè)計(jì)網(wǎng)站時(shí)顯得復(fù)雜化。XML保留了SGML的結(jié)構(gòu)化功能,這樣就使得網(wǎng)站設(shè)計(jì)者可以定義自己的文檔類型,XML同時(shí)也推出一種新型文檔類型,使得開發(fā)者也可以不必定義文檔類型。
因?yàn)閄ML是W3C制定的,XML的標(biāo)準(zhǔn)化工作由W3C的XML工作組負(fù)責(zé),該小組成員由來自各個(gè)地方和行業(yè)的專家組成,他們通過email交流對(duì)XML標(biāo)準(zhǔn)的意見,并提出自己的看法 (www.w3.org/TR/WD-xml)。因?yàn)閄ML 是個(gè)公共格式, (它不專屬于任何一家公司),你不必?fù)?dān)心XML技術(shù)會(huì)成為少數(shù)公司的盈利工具,XML不是一個(gè)依附于特定瀏覽器的語言
XML(可擴(kuò)展標(biāo)記語言)是從稱為SGML(標(biāo)準(zhǔn)通用標(biāo)記語言)的更加古老的語言派生出來的。SGML的主要目的是定義使用標(biāo)簽來表示數(shù)據(jù)的標(biāo)記語言的語法。
標(biāo)簽由包圍在一個(gè)小于號(hào)(<)和一個(gè)大于號(hào)(>)之間的文本組成,例如<tag>。起始標(biāo)簽(start tag)表示一個(gè)特定區(qū)域的開始,例如<start>;結(jié)束標(biāo)簽(end tag)定義了一個(gè)區(qū)域的結(jié)束,除了在小于號(hào)之后緊跟著一個(gè)斜線(/)外,和起始標(biāo)簽基本一樣,例如</end>。SGML還定義了標(biāo)簽的特性(attribute),它們是定義在小于號(hào)和大于號(hào)之間的值,例如<img src="picture.jpg">中的src特性。如果你覺得它看起來很熟悉的話,應(yīng)該知道,基于SGML的語言的最著名實(shí)現(xiàn)就是原始的HTML。
SGML常用來定義針對(duì)HTML的文檔類型定義(DTD),同時(shí)它也常用于編寫XML的DTD。SGML的問題就在于,它允許出現(xiàn)一些奇怪的語法,這讓創(chuàng)建HTML的解析器成為一個(gè)大難題:
1 某些起始標(biāo)簽不允許出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<img>標(biāo)簽。包含了結(jié)束標(biāo)簽就會(huì)出現(xiàn)錯(cuò)誤。
2 某些起始標(biāo)簽可以選擇性出現(xiàn)結(jié)束標(biāo)簽或者隱含了結(jié)束標(biāo)簽,例如HTML中<p>標(biāo)簽,當(dāng)出現(xiàn)另一個(gè)<p>標(biāo)簽或者某些其他標(biāo)簽時(shí),便假設(shè)在這之前有一個(gè)結(jié)束標(biāo)簽。
3 某些起始標(biāo)簽要求必須出現(xiàn)結(jié)束標(biāo)簽,例如HTML中<script>標(biāo)簽。
4 標(biāo)簽可以以任何順序嵌套。即使結(jié)束標(biāo)簽不按照起始標(biāo)簽的逆序出現(xiàn)也是允許的,例如,<b>This is a <i> sample </b> string</i>是正確的。
5 某些特性要求必須包含值,例如<img src="picture.jpg">中的src特性。
6 某些特性不要求一定有值,例如<td nowrap>中的nowrap特性。
7 定義特性的兩邊有沒有加上雙引號(hào)都是可以的,所以<img src="picture.jpg">和<img src=picture.jpg>都是允許的。
這些問題使建立一個(gè)SGML語言的解析器變成了一項(xiàng)艱巨的任務(wù)。判斷何時(shí)應(yīng)用以上規(guī)則的困難導(dǎo)致了SGML語言的定義一直停滯不前。以這些問題作為出發(fā)點(diǎn),XML逐漸步入我們的視野。
XML去掉了之前令許多開發(fā)人員頭疼的SGML的隨意語法。在XML中,采用了如下的語法:
8 任何的起始標(biāo)簽都必須有一個(gè)結(jié)束標(biāo)簽。
9 可以采用另一種簡(jiǎn)化語法,可以在一個(gè)標(biāo)簽中同時(shí)表示起始和結(jié)束標(biāo)簽。這種語法是在大于符號(hào)之前緊跟一個(gè)斜線(/),例如<tag />。XML解析器會(huì)將其翻譯成<tag></tag>。
10 標(biāo)簽必須按合適的順序進(jìn)行嵌套,所以結(jié)束標(biāo)簽必須按鏡像順序匹配起始標(biāo)簽,例如<b>this is a <i>sample</i> string</b>。這好比是將起始和結(jié)束標(biāo)簽看作是數(shù)學(xué)中的左右括號(hào):在沒有關(guān)閉所有的內(nèi)部括號(hào)之前,是不能關(guān)閉外面的括號(hào)的。
11 所有的特性都必須有值。
12 所有的特性都必須在值的周圍加上雙引號(hào)。
這些規(guī)則使得開發(fā)一個(gè)XML解析器要簡(jiǎn)便得多,而且也除去了解析SGML中花在判斷何時(shí)何地應(yīng)用那些奇怪語法規(guī)則上的工作。僅僅在XML出現(xiàn)后的前六年就衍生出多種不同的語言,包括MathML、SVG、RDF、RSS、SOAP、XSLT、XSL-FO,而同時(shí)也將HTML改進(jìn)為XHTML。
如果需要關(guān)于SGML和XML具體技術(shù)上的對(duì)比,請(qǐng)查看W3C的注解,位于:http://www.w3. org/TR/NOTE-sgml-xml.html
如今,XML已經(jīng)是世界上發(fā)展最快的技術(shù)之一。它的主要目的是使用文本以結(jié)構(gòu)化的方式來表示數(shù)據(jù)。在某些方面,XML文件也類似于數(shù)據(jù)庫,提供數(shù)據(jù)的結(jié)構(gòu)化視圖。這里是一個(gè)XML文件的例子:
每個(gè)XML文檔都由XML序言開始,在前面的代碼中的第一行便是XML序言,<?xml version="1.0"?>。這一行代碼會(huì)告訴解析器和瀏覽器,這個(gè)文件應(yīng)該按照前面討論過的XML規(guī)則進(jìn)行解析。第二行代碼,<books>,則是文檔元素(document element),它是文件中最外面的標(biāo)簽(我們認(rèn)為元素(element)是起始標(biāo)簽和結(jié)束標(biāo)簽之間的內(nèi)容)。所有其他的標(biāo)簽必須包含在這個(gè)標(biāo)簽之內(nèi)來組成一個(gè)有效的XML文件。XML文件的第二行并不一定要包含文檔元素;如果有注釋或者其他內(nèi)容,文檔元素可以遲些出現(xiàn)。
范例文件中的第三行代碼是注釋,你會(huì)發(fā)現(xiàn)它與HTML中使用的注釋風(fēng)格是一樣的。這是XML從SGML中繼承的語法元素之一。
頁面再往下的一些地方,可以發(fā)現(xiàn)<desc>標(biāo)簽里有一些特殊的語法。<![CDATA[ ]]>代碼用于表示無需進(jìn)行解析的文本,允許諸如大于號(hào)和小于號(hào)之類的特殊字符包含在文本中,而無需擔(dān)心破壞XML的語法。文本必須出現(xiàn)在<![CDATA[和]]>之間才能合適地避免被解析。這樣的文本稱為Character Data Section,簡(jiǎn)稱CData Section。
下面的一行就是在第二本書的定義之前的:
<?page render multiple authors ?>
雖然它看上去很像XML序言,但實(shí)際上是一種稱為處理指令(processing instruction)的不同類型的語法。處理指令(以下簡(jiǎn)稱PI)的目的是為了給處理頁面的程序(例如XML解析器)提供額外的信息。PI通常情況下是沒有固定格式的,唯一的要求是緊隨第一個(gè)問號(hào)必須至少有一個(gè)字母。在此之后,PI可以包含除了小于號(hào)和大于號(hào)之外的任何字符串序列。
最常見的PI是用來指定XML文件的樣式表:
這個(gè)PI一般會(huì)直接放在XML序言之后,通常由Web瀏覽器使用,來將XML數(shù)據(jù)以特殊的樣式顯示出來。