書名: Web Services應(yīng)用開發(fā)作者名: 邵峰晶主編本章字?jǐn)?shù): 9703字更新時間: 2018-12-26 19:42:00
第1章 XML概述
本章目標(biāo)
■ 了解XML的歷史
■ 了解XML的特點
■ 了解XML的基本特征
■ 掌握XML的文檔結(jié)構(gòu)
■ 掌握XML文檔的組成要素及其使用
■ 掌握格式良好的XML文檔規(guī)則
■ 了解有效XML文檔的實現(xiàn)方式
■ 掌握基本XML文檔的編寫
學(xué)習(xí)導(dǎo)航
任務(wù)描述
【描述1.D.1】
使用XML描述學(xué)生信息,并使用IE瀏覽器查看數(shù)據(jù)結(jié)果。
【描述1.D.2】
創(chuàng)建含有中文字符的XML文件,并使用IE瀏覽器查看數(shù)據(jù)結(jié)果。
【描述1.D.3】
創(chuàng)建XML文檔并使用字符引用,在IE瀏覽器中查看數(shù)據(jù)結(jié)果。
【描述1.D.4】
創(chuàng)建XML文檔并使用實體引用,在IE瀏覽器中查看數(shù)據(jù)結(jié)果。
【描述1.D.5】
創(chuàng)建XML文檔并使用CDATA節(jié),在IE瀏覽器中查看數(shù)據(jù)結(jié)果。
【描述1.D.6】
創(chuàng)建XML文檔并使用處理指令(PI)。
【描述1.D.7】
使用DTD定義有效的XML文檔。
1.1 XML概述
XML(eXtensible Markup Language,可擴(kuò)展標(biāo)記語言)是一種元標(biāo)記語言,是Internet環(huán)境中跨平臺的、依賴于內(nèi)容的技術(shù),也是當(dāng)今處理分布式結(jié)構(gòu)信息的有效工具。
1.1.1 XML的歷史
XML有兩個先驅(qū):SGML和HTML,這兩個語言都是非常成功的標(biāo)記語言,但是都具有一些與生俱來的缺陷。XML正是為了解決它們的不足而誕生的。
1.SGML
早在Web未發(fā)明之前,SGML(Standard Generalized Markup Language,標(biāo)準(zhǔn)通用標(biāo)記語言)就已存在,正如它的名稱所言,SGML是國際上定義電子文件結(jié)構(gòu)和內(nèi)容描述的標(biāo)準(zhǔn)。SGML具有非常復(fù)雜的文檔結(jié)構(gòu),主要用于大量高度結(jié)構(gòu)化數(shù)據(jù)的訪問和其他各種工業(yè)領(lǐng)域,在分類和索引數(shù)據(jù)中非常有用。
雖然SGML的功能很強(qiáng)大,但是它不適用于Web數(shù)據(jù)描述,而且SGML軟件的價格非常昂貴;另外,SGML十分龐大,既不容易學(xué),也不容易使用,在計算機(jī)上實現(xiàn)也十分困難;不僅如此,幾個主要的瀏覽器廠商都明確拒絕支持SGML,這無疑是SGML在網(wǎng)上傳播遇到的最大障礙。鑒于這些因素,Web的發(fā)明者——歐洲核子物理研究中心的研究人員根據(jù)當(dāng)時(1989年)的計算機(jī)技術(shù),開發(fā)了HTML。
2.HTML
1989年HTML誕生,它拋棄了SGML的復(fù)雜龐大的缺點,繼承了SGML很多優(yōu)點。HTML最大的特點是簡單和跨平臺。
HTML是一種界面技術(shù),它只使用了SGML中很少的一部分標(biāo)記,例如HTML 4.0中只定義了70余種標(biāo)記。為了便于在計算機(jī)上實現(xiàn),HTML規(guī)定的標(biāo)記是固定的,即HTML語法是不可擴(kuò)展的。HTML這種固定的語法使它易學(xué)易用,在計算機(jī)上開發(fā)HTML的瀏覽器也十分容易。正是由于HTML的簡單性,使得基于HTML的Web應(yīng)用得到極大的發(fā)展。
3.XML的產(chǎn)生
隨著Web應(yīng)用的不斷發(fā)展,HTML的局限性也越來越明顯地體現(xiàn)了出來,如HTML無法描述數(shù)據(jù)、可讀性差、搜索時間長等。人們又把目光轉(zhuǎn)向SGML,再次改造SGML使之適合現(xiàn)在的網(wǎng)絡(luò)需求。隨著先輩的努力,在1998年2月10日,W3C(World Wide Web Consortium,萬維網(wǎng)聯(lián)盟)公布XML 1.0標(biāo)準(zhǔn),XML誕生了。
XML最初的設(shè)計目的是為了EDI(Electronic Data Interchange,電子數(shù)據(jù)交換),確切地說是為電子數(shù)據(jù)交換提供一個統(tǒng)一的標(biāo)準(zhǔn)數(shù)據(jù)格式。
在EDI應(yīng)用過程中,XML展現(xiàn)了如下優(yōu)勢。
■ 低成本,XML不需要VAN(Value-Added Network,增值網(wǎng)絡(luò))的高額費用,中小企業(yè)也負(fù)擔(dān)得起。
■ 定制商業(yè)規(guī)則,XML允許用戶創(chuàng)建自己的商業(yè)規(guī)則和格式。
■ 容易解釋,EDI需要使用翻譯軟件來得到貿(mào)易伙伴的信息格式,而XML通過免費下載的解析器就可以很容易地解釋。
■ 平臺獨立,XML是跨平臺的語言,不管是什么平臺,都能進(jìn)行數(shù)據(jù)交換。
當(dāng)前的一些內(nèi)容建設(shè)者們已經(jīng)開始開發(fā)各種各樣的XML擴(kuò)展,比如數(shù)學(xué)標(biāo)記語言MathML、化學(xué)標(biāo)記語言CML等。此外,一些著名的IT公司,如Oracle、IBM以及微軟等都積極地投入人力與財力研發(fā)XML相關(guān)軟件與服務(wù)支持,這無疑確定了XML在IT產(chǎn)業(yè)的重要地位。
1.1.2 XML的基本特征
XML是一個精簡的SGML子集,它將SGML的豐富功能與HTML的易用性結(jié)合到Web的應(yīng)用中。XML保留了SGML的可擴(kuò)展功能,這使XML從根本上有別于HTML。XML要比HTML強(qiáng)大得多,它不再是固定的標(biāo)記,而是允許定義不限數(shù)量的標(biāo)記來描述文檔中的資料,允許嵌套的信息結(jié)構(gòu)。HTML只是Web顯示數(shù)據(jù)的通用方法,而XML則提供了一個直接處理Web數(shù)據(jù)的通用方法。
XML具有以下一些特點。
XML可以從HTML中分離數(shù)據(jù),即能夠在HTML文件之外將數(shù)據(jù)存儲在XML文檔中,這樣可以使開發(fā)者集中精力使用HTML做好數(shù)據(jù)的顯示和布局,并確保數(shù)據(jù)改動時不會導(dǎo)致HTML文件也需要改動,從而方便維護(hù)頁面。XML也能夠?qū)?shù)據(jù)以“數(shù)據(jù)島”的形式存儲在HTML頁面中,開發(fā)者依然可以把精力集中到使用HTML格式化和顯示數(shù)據(jù)上去。
■ XML可用于交換數(shù)據(jù)。基于XML可以在不兼容的系統(tǒng)之間交換數(shù)據(jù),計算機(jī)系統(tǒng)和數(shù)據(jù)庫系統(tǒng)所存儲的數(shù)據(jù)有NN種形式,對于開發(fā)者來說,最耗時間的工作就是在遍布網(wǎng)絡(luò)的系統(tǒng)之間交換數(shù)據(jù)。把數(shù)據(jù)轉(zhuǎn)換為XML格式存儲將大大減少交換數(shù)據(jù)時的復(fù)雜性,還可以使這些數(shù)據(jù)能被不同的程序讀取。
■ XML可應(yīng)用于B2B中。例如在網(wǎng)絡(luò)中交換金融信息,目前XML正成為在遍布網(wǎng)絡(luò)的商業(yè)系統(tǒng)之間交換信息所使用的主要語言,許多與B2B有關(guān)的完全基于XML的應(yīng)用程序正在開發(fā)中。
■ 利用XML可以共享數(shù)據(jù)。XML數(shù)據(jù)以純文本格式存儲,這使得XML更易讀、更便于記錄、更便于調(diào)試,使不同系統(tǒng)、不同程序之間的數(shù)據(jù)共享變得更加簡單。
■ XML可以充分利用數(shù)據(jù)。XML是與軟件、硬件和應(yīng)用程序無關(guān)的,數(shù)據(jù)可以被更多的用戶、設(shè)備所利用,而不僅僅限于基于HTML標(biāo)準(zhǔn)的瀏覽器。其他客戶端和應(yīng)用程序可以把XML文檔作為數(shù)據(jù)源來處理,就像操作數(shù)據(jù)庫一樣,XML的數(shù)據(jù)可以被各種各樣的“閱讀器”處理。
■ XML可以用于創(chuàng)建新的語言。比如,WAP和WML語言都是由XML發(fā)展來的。WML(Wireless Markup Language,無線標(biāo)記語言)是用于標(biāo)識運行于手持設(shè)備上(比如手機(jī))的Internet程序的工具,它就采用了XML的標(biāo)準(zhǔn)。
總之,XML使用一個簡單而又靈活的標(biāo)準(zhǔn)格式,為基于Web的應(yīng)用提供了一個描述數(shù)據(jù)和交換數(shù)據(jù)的有效手段。但是,XML并非是用來取代HTML的。HTML著重于如何描述將文件顯示在瀏覽器中,而XML與SGML相近,著重于如何將數(shù)據(jù)以結(jié)構(gòu)化方式表示。就網(wǎng)頁顯示功能來說,HTML比XML強(qiáng),但就文件的應(yīng)用范疇來說,XML比HTML超出很多。XML和HTML在各個方面上的對比如表1-1所示。
表1-1 XML和HTML對比
1.1.3 XML定義
XML是元標(biāo)記語言,定義了用于定義與其他特定領(lǐng)域有關(guān)的、語義的、結(jié)構(gòu)化的標(biāo)記語言句法的語言。可以從以下幾個方面來定義XML。
XML是一種類似于HTML的標(biāo)記語言。
■ XML是用來描述數(shù)據(jù)的。
■ XML的標(biāo)記不是在XML中預(yù)定義的,用戶可以自定義標(biāo)記。
■ XML使用文檔類型定義(DTD)或者模式(Schema)來描述數(shù)據(jù)。
下述代碼用于實現(xiàn)任務(wù)【描述1.D.1】,使用XML描述學(xué)生信息,并使用IE瀏覽器查看數(shù)據(jù)結(jié)果。
【描述1.D.1】 student.xml
<?xml version="1.0" ?> <!-- File Name:student.xml --> <students> <student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student> <student sex = "female"> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student> <student sex = "male"> <name>Jack</name> <age>15</age> </student> </students>
上述代碼只能讓讀者感性地認(rèn)識XML,并不能實現(xiàn)什么具體應(yīng)用,它只是用XML標(biāo)記存儲信息的文件。
對于XML文件,可以用IE 5.0或以上版本的瀏覽器來查看其內(nèi)容,如果在IE瀏覽器中打開一個XML文檔,它將用顏色顯示文檔編碼的根和子元素,如圖1-1所示。

圖1-1 用IE瀏覽器查看XML文件結(jié)果
可以單擊元素左邊的加號(+)或減號(-)來展開或收縮元素的結(jié)構(gòu),如果想查看原始的XML源文件,就必須從瀏覽器菜單中選擇“查看源文件”(View Source)命令,如果打開的XML文件是錯誤的,IE瀏覽器就會報告錯誤,如圖1-2所示。

圖1-2 出錯時的顯示結(jié)果
XML是自由的、可以擴(kuò)展的,XML標(biāo)記(tag)并不是事先定義好的。在XML中,用戶可以根據(jù)需要定義自己的標(biāo)記以及文檔結(jié)構(gòu)。比如,上面例子中<students>、<name>、<age>等標(biāo)記都是這個XML文檔的作者創(chuàng)建出來的。而在HTML文檔中必須使用HTML規(guī)范中定義好的標(biāo)記,比如<P>、<hr>、<a>、</a>等。
XML可以從HTML中分離數(shù)據(jù),即能夠在HTML文件之外將數(shù)據(jù)存儲在XML文檔中,這樣可以使開發(fā)者集中精力使用HTML做好數(shù)據(jù)的顯示和布局,并確保數(shù)據(jù)改動時不會導(dǎo)致HTML文件也需要改動,從而方便維護(hù)頁面。XML也能夠?qū)?shù)據(jù)以“數(shù)據(jù)島”的形式存儲在HTML頁面中,開發(fā)者依然可以把精力集中到使用HTML格式化和顯示數(shù)據(jù)上去。
1.2 XML文檔結(jié)構(gòu)
XML的語法規(guī)則既簡單又嚴(yán)格,非常容易學(xué)習(xí)和使用。XML文檔使用了自描述的簡單語法,如果熟悉HTML,就會發(fā)現(xiàn)它的文檔和HTML非常相似。
XML文檔有兩個主要組成部分:序言(prolog)和文檔元素(document element,即根元素)。
序言出現(xiàn)在XML文檔的頂部,其中包含關(guān)于該文檔的一些信息,有點兒像HTML文檔中的<head>部分。在【描述1.D.1】的XML文檔student.xml中,序言包含了一個XML聲明。序言也可以包含其他的元素,如注釋、處理指令或是DTD(文檔類型定義)。
任何XML文檔必須有且只有一個文檔元素(或稱根元素),用來包含可能有的其他內(nèi)容。XML文檔中的所有內(nèi)容都應(yīng)該出現(xiàn)在根元素的內(nèi)部。在遵守XML命名規(guī)則的前提下,用戶可以為元素和屬性選擇任何名字(命名應(yīng)遵循簡單易懂的原則)。圖1-3顯示了XML文檔的結(jié)構(gòu)。

圖1-3 XML文檔的結(jié)構(gòu)
1.2.1 序言
XML序言由兩行組成:
<?xml version="1.0" ?> <!—File Name:student.xml-->
其中:
第一行是XML聲明,表明這是一個XML文檔,并且遵循的是XML 1.0版的規(guī)范。
■ 第二行是注釋。引入注釋可以增強(qiáng)文檔的可讀性,XML文檔的注釋是可選的。
XML聲明由“<?”開始,以“?>”結(jié)束。“<?”就表示該行是一個命令;在“<?”后面緊跟“xml”,表示該文件是一份XML文件(注意必須小寫),這是處理指令的名稱。在其后可聲明XML的版本、采用的字符集等屬性;在“<”和“?”之間、“?”和“>”之間,以及第一個“?”和“xml”之間不能有空格。在第二個“?”之前可以沒有、也可以有一個或多個空格。
XML聲明語句中通常可以有如下屬性。
version:該屬性是必需的,且必須要小寫,用于表明XML的版本,解析器對不同的版本的解析會有區(qū)別。
■ encoding:該屬性是可選的,用于表明該文檔所使用的字符編碼方式。XML支持多種字符集類型,例如,使用下面的語句指明文檔中的字符編碼方式為GB2312編碼。
<?xml version="1.0" encoding="GB2312" ?>
standalone:該屬性定義了是否可以在不讀取任何其他文件的情況下處理該文檔,其屬性值可以是yes或no,如果XML文檔沒有引用任何其他文件,則可以指定standalone="yes",否則standalone="no"。standalone的默認(rèn)值是no。
注意 如果同時設(shè)置了encoding和standalone屬性,standalone屬性要位于encoding屬性之后。
對于含有中文字符的XML,可以采用“Unicode”或“GB2312”等支持中文字符的編碼來表示,如果文檔中的字符使用的是GB2312編碼,則必須設(shè)置encoding屬性值為GB2312。
下述代碼用于實現(xiàn)任務(wù)【描述1.D.2】,創(chuàng)建含有中文字符的XML文件,并查看數(shù)據(jù)結(jié)果。
【描述1.D.2】 student_gb2312.xml
<?xml version="1.0" encoding="GB2312" ?> <學(xué)生花名冊> <學(xué)生 性別 = "男"> <姓名>湯米</姓名> <年齡>14</年齡> <電話>88889999</電話> </學(xué)生> <學(xué)生 性別 = "女"> <姓名>羅斯</姓名> <年齡>16</年齡> <電話>66667777</電話> </學(xué)生> <學(xué)生 性別 = "男"> <姓名>杰克</姓名> <年齡>15</年齡> </學(xué)生> </學(xué)生花名冊>
上述XML代碼中,由于存在中文字符,需要在XML聲明中引入encoding屬性,并設(shè)置屬性值為“GB2312”,否則將會顯示字符編碼錯誤,如圖1-4所示。

圖1-4 字符編碼錯誤
錯誤提示的信息是“文本內(nèi)容中發(fā)現(xiàn)無效字符”,這是因為在XML文檔聲明語句中沒有明確指定文檔中的字符編碼方式,瀏覽器就會用默認(rèn)的Unicode編碼來解析該文檔,而該文檔中的字符實際上使用的是GB2312編碼,而非Unicode編碼。
注意 XML支持多種字符集類型。但一般常用的編碼有如下幾種:簡體中文碼(GB2312)、繁體中文碼(BIG5)、UTF-8。
另外,序言部分還可以包括下列可選組成部分。
文檔類型聲明(DTD),它定義了文檔的類型和結(jié)構(gòu)。
■ 一個或多個處理指令,它提供了XML處理器傳遞給應(yīng)用的信息。
1.2.2 文檔元素
XML文檔的第二個主要部分是文檔元素(根元素)。在XML文檔中,元素指出了文檔的邏輯結(jié)構(gòu),并且包含了文檔的信息內(nèi)容(在示例文檔中是學(xué)生的信息,例如姓名、年齡和電話)。一個典型的元素有起始標(biāo)簽、元素內(nèi)容和結(jié)束標(biāo)簽。元素的內(nèi)容可以是字符數(shù)據(jù)、其他(嵌套的)元素或者兩者的組合。
整個XML文檔就是由標(biāo)記和字符數(shù)據(jù)混合成的。標(biāo)記是用來描述文檔結(jié)構(gòu)的定界文本,即元素的起始標(biāo)簽、元素的結(jié)束標(biāo)簽、空元素標(biāo)簽、注釋、文檔類型聲明、處理指令、CDATA節(jié)定界符、實體引用和字符引用等。
在示例文檔中,文檔元素是students。其起始標(biāo)簽是<students>,結(jié)束標(biāo)簽是</students>,其內(nèi)容是兩個嵌套的student元素,每個student元素同樣包括一系列的嵌套元素。
注意 XML文檔中的文檔元素類似于HTML頁中的<BODY>元素,但XML文檔元素可以具有任意合法的名稱。
1.3 XML文檔內(nèi)容
XML文檔必須有一個根元素,用來包含可能有的其他內(nèi)容。XML文檔中的所有內(nèi)容都應(yīng)該出現(xiàn)在根元素的內(nèi)部。在遵守XML命名規(guī)則的前提下,用戶可以為元素和屬性選擇任何名字。XML文檔內(nèi)容的主體部分一般由根元素、子元素、屬性、注釋和內(nèi)容組成。
XML文檔的內(nèi)容結(jié)構(gòu)如圖1-5所示。

圖1-5 XML內(nèi)容結(jié)構(gòu)圖
1.3.1 XML元素
元素是XML文檔的基本組成部分。它們可以包含其他的元素、字符數(shù)據(jù)、字符引用、實體引用、PI(Processing Instruction,處理指令)、注釋或CDATA部分——這些合在一起被稱做元素內(nèi)容(element content)。所有的XML數(shù)據(jù)(除了注釋、PI和空白)都必須包容在元素中。
XML文檔中其他所有元素都是根元素的后代(子元素),student.xml中的根元素是<students>,而<student>、<name>、<age>、<tel>都是它的子元素。
在XML文檔中,元素有很多作用,它們可以標(biāo)記內(nèi)容;為它們標(biāo)記的內(nèi)容提供一些描述;為數(shù)據(jù)的順序和相對重要性提供信息;展示數(shù)據(jù)之間的關(guān)系。
XML中元素使用標(biāo)記進(jìn)行分隔,標(biāo)記由一對尖括號(“<>”)圍住元素名稱(一個字符串)構(gòu)成。每一個元素都必須由一個起始標(biāo)記和一個結(jié)束標(biāo)記分隔開。
在XML中,基本上沒有什么保留字,可以用任何字符串來作為元素名稱,但是XML元素的命名必須遵守下列規(guī)范。
元素的名字可以包含字母、數(shù)字和其他合法字符,且區(qū)分大小寫。
■ 元素的名字不能以數(shù)字或者標(biāo)點符號開頭。
■ 元素的名字不能以XML(或者xml、Xml、xMl等)開頭。
■ 元素的名字不能包含空格,并且避免使用“-”、“.”、“:”等特殊字符。
■ 元素的命名應(yīng)該遵循簡單易讀的原則。
■ 如果XML文檔與數(shù)據(jù)表對應(yīng),應(yīng)盡量讓XML文檔中元素的命名和數(shù)據(jù)庫中字段的命名保持一致,這樣可以方便數(shù)據(jù)變換。
■ 非英文字符、字符串也可以作為XML元素的名字,例如<姓名>、<年齡>等,但為了得到更好的支持,建議使用英文字母來進(jìn)行命名。
1.起始標(biāo)記
一個元素開始的分隔符被稱做起始標(biāo)記。起始標(biāo)記是一個包含在尖括號(“< >”)里的元素名稱。可以把起始標(biāo)記看做是“打開”了一個元素。下面是一些合法的起始標(biāo)記:<student>,<Student>,<STUDENT>。需要特殊說明的是,元素名稱可以使用任何合法字母,而不一定是ASCII碼字符。
2.結(jié)束標(biāo)記
一個元素最后的分隔符被稱做結(jié)束標(biāo)記。結(jié)束標(biāo)記由一個斜杠(“/”)和元素名稱組成,被括在一對尖括號(“< >”)中。每一個結(jié)束標(biāo)記都必須與一個起始標(biāo)記相匹配,可以把結(jié)束標(biāo)記理解為關(guān)閉了一個由起始標(biāo)記打開的元素。下面是一些合法的結(jié)束標(biāo)記,它們與前面列舉的起始標(biāo)記相對應(yīng):</student>,</Student>,</STUDENT>。
帶有完整的起始、結(jié)束標(biāo)記的元素應(yīng)該是如下形式:
<自定義標(biāo)記>包含的內(nèi)容</自定義標(biāo)記>
3.元素分類
XML文檔中一共有四類元素:空元素,僅含文本的元素,僅含子元素的元素,含子元素、文本或混合元素的元素。
(1)空元素
如果元素中不包含任何文本或子元素,那么它就是一個空元素。對于空元素,可以只加入起始標(biāo)記和結(jié)束標(biāo)記而不在其中包含任何內(nèi)容,如下述代碼所示:
<student></student>
空元素的精簡表示方式是:由一個元素名稱緊跟一個斜杠(“/”)組成,并括在一對尖括號(“< >”)中。下面的代碼與上述代碼的功能是一致的。
<student/>
(2)僅含文本的元素
有些元素含有文本內(nèi)容。下述代碼中<name>和<age>都是含有文本的元素:
<name>Rose</name> <age>16</age>
(3)僅含子元素的元素
一個元素可以包含其他的元素。容器元素稱為父(parent)元素,被包含的元素稱為子(child)元素。例如<student>元素就是一個包含子元素的元素:
<student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
(4)混合元素
混合元素既含有文本也含有子元素。下面的代碼片段顯示了一個混合元素:
<student sex = "male"> 大一四班 <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
4.元素嵌套
XML對元素有一個非常重要的要求——它們必須正確地嵌套。也就是說,如果一個元素(通過起始標(biāo)簽和結(jié)束標(biāo)簽來分隔)在另一個元素內(nèi)部開始,那么也必須在同一個元素內(nèi)部結(jié)束。例如,下列這些元素的是格式良好的:
<student> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student>
而下列這些元素的格式是不正確的:
<student> <name>Tom <age>14</age> <tel>88889999</tel> </student></name>
當(dāng)遇到?jīng)]有被正確使用的嵌套標(biāo)記時,XML解析器會立刻報告一個“not well-formed(非格式良好的)”錯誤報告,在IE瀏覽器中的錯誤信息如圖1-6所示。

圖1-6 元素嵌套錯誤
綜上所述,在XML文檔中使用元素時應(yīng)注意以下幾點要求。
元素必須含有起始標(biāo)簽和結(jié)束標(biāo)簽。
■ 在沒有內(nèi)容(空元素)的情況下,建議使用省略寫法。
■ 標(biāo)簽名稱必須符合XML命名規(guī)則。
■ 元素必須正確地嵌套。
1.3.2 XML屬性
XML元素可以擁有屬性。屬性是對標(biāo)記進(jìn)一步的描述和說明,一個標(biāo)記可以有多個屬性。XML中的屬性與HTML中的屬性是一樣的,每個屬性都有它自己的名字和數(shù)值,屬性是標(biāo)記的一部分。例如:
<student sex = "male"> </student>
XML中的屬性也是由用戶自己定義的,屬性由“名稱/值”對組成,其中的值是包含于單引號或雙引號中的;一個元素可以有多個屬性,它的基本格式為:
<元素名 屬性名="屬性值">
特定的屬性名稱在同一個元素標(biāo)記中只能出現(xiàn)一次;屬性值不能包括“<”、“>”、“&”。
例如student元素中可以使用屬性表示學(xué)生的性別:
<student sex = "male"></student>
也可以這樣寫:
<student sex = 'male'></student>
上面的兩種寫法在一般情況下是沒有區(qū)別的,雙引號的寫法更普遍一些。
當(dāng)元素包含屬性時,常稱為復(fù)合類型(complex type)元素,在書寫XML模式文檔時是常見的應(yīng)用模式。
在XML中,可以將屬性改寫為嵌套的子元素。例如,對于下列代碼:
<student sex = "female"> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student>
可以改寫為:
<student> <sex>female</sex> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student>
上述兩種寫法都能夠正確地描述數(shù)據(jù),哪種寫法更好并沒有一個明確的規(guī)則,兩種寫法都是可接受的。
屬性在HTML中可能十分便利,但在XML中,最好避免使用屬性。因為使用屬性時會引發(fā)以下一些問題。
屬性不能包含多個值(而子元素可以)。
■ 屬性不容易擴(kuò)展。
■ 屬性不能夠描述結(jié)構(gòu)(而子元素可以)。
■ 在使用程序代碼進(jìn)行處理時,屬性比子元素要難解析。
■ 屬性值很難通過DTD進(jìn)行測試。
■ 使用屬性來存儲數(shù)據(jù),XML文檔比較難以閱讀和操作。
注意 在XML定義中經(jīng)常用到屬性,但在描述數(shù)據(jù)時建議盡量使用元素,僅在描述那些與數(shù)據(jù)關(guān)系不大的額外信息時使用屬性。
1.3.3 注釋
XML中,注釋以“<!--”開始,以“-->”結(jié)束,除了在XML聲明之前,注釋可以出現(xiàn)在XML文檔的其他任何位置。在進(jìn)行XML解析時,注釋內(nèi)的任何標(biāo)記都被忽略,如果希望除去XML文檔的一塊較大部分,只需用注釋標(biāo)記括住那個部分即可。
XML中,注釋的語法如下所示。
<!-- 這里是注釋信息 -->
例如:
<!-- File Name:student.xml -->
加入注釋通常是為了便于閱讀和理解,注釋并不影響XML文檔的處理。在添加注釋時需要遵循以下規(guī)則。
注釋里不能包含文本“--”。
■ 注釋不能包含于標(biāo)記內(nèi)部。
■ 元素中的開始標(biāo)簽或結(jié)束標(biāo)簽不能被單獨注釋掉。
1.3.4 字符引用和實體引用
與SGML和HTML一樣,XML為顯示非ASCII碼字符集中的字符提供了兩種方法:字符引用和實體引用。
1.字符引用
實際處理過程中,不在鍵盤上的字符或是圖形字符是無法直接輸入的,這種情況下,可以使用Unicode碼將它們以字符引用的形式加入。比如,可以將版權(quán)符號“?”編碼成“©”。以“&#”開始并以“;”結(jié)束的引用都是字符引用。中間的數(shù)字是所需字符的Unicode編碼,如果編碼寫成十六進(jìn)制形式,應(yīng)該使用一個“x”作為前綴,比如“©”也可表示為“©”。下述代碼是兩個示例:
&#AAAAA; &#XXXXX;
上面的字符串“AAAAA”和“XXXXX”可能是一個或多個數(shù)字,對應(yīng)著任何XML允許的Unicode字符值,可以是十進(jìn)制數(shù)字或十六進(jìn)制數(shù)字。
下述代碼用于實現(xiàn)任務(wù)【描述1.D.3】,演示了如何使用字符引用。
【描述1.D.3】 chars.xml
<?xml version="1.0" ?> <chars> <ch>©</ch> <ch>©</ch> <ch>®</ch> <ch>®</ch> </chars>
通過IE瀏覽器查看結(jié)果如圖1-7所示。

圖1-7 字符引用演示
2.實體引用
實體引用允許在元素內(nèi)容或?qū)傩灾抵胁迦肴魏巫址@就為字符引用提供了一種助記的替代方式。實體引用方式是在一個合法的XML名字前面加上一個“&”符號,后面加上一個分號“;”,如下所示:
&name;
有五個實體被定義為XML的固有部分,它們通常作為XML標(biāo)記分隔符號的轉(zhuǎn)義序列,如表1-2所示。
表1-2 XML的轉(zhuǎn)義字符
下述代碼用于實現(xiàn)任務(wù)【描述1.D.4】,演示了如何使用實體引用。
【描述1.D.4】 chars2.xml
<?xml version="1.0" ?> <chars> <ch><</ch> <ch>></ch> <ch>&</ch> <ch>"</ch> <ch>'</ch> </chars>
通過IE瀏覽器查看結(jié)果,如圖1-8所示。

圖1-8 實體引用演示
1.3.5 CDATA節(jié)
一般情況下,為了能在元素內(nèi)容的字符數(shù)據(jù)中插入特殊字符(如<、>、&等),可使用字符引用或者一個預(yù)定義的通用實體引用。但如果存在大量的特殊字符,使用這種方式就很笨拙而且使數(shù)據(jù)難以閱讀。在這種情況下,可以將包含限制字符的文本放在CDATA節(jié)中。
CDATA節(jié)以“<![CDATA[”開始,并以“]]>”結(jié)束。在這兩個限定字符組之間,可以輸入除了“]]>”之外(因為它會被解釋為CDATA節(jié)的結(jié)束)的任意字符。CDATA節(jié)中的所有字符都會被當(dāng)做元素字符數(shù)據(jù)的常量部分,而不是XML標(biāo)記。
下述代碼用于實現(xiàn)任務(wù)【描述1.D.5】,演示了CDATA節(jié)的使用。
【描述1.D.5】 CDATA.xml
<?xml version="1.0" encoding="GB2312"?>
<files>
<file>
<name>special.txt</name>
<!--使用CDATA節(jié)可以輸入除]]外的任何字符 -->
<content><![CDATA[some special charactor " ' < > & ]]></content>
</file>
<file>
<name>special.txt</name>
<!--不使用CDATA節(jié)需要使用字符引用或?qū)嶓w引用來輸入特殊字符 -->
<content>some special charactor " ' < > & </content>
</file>
</files>
通過IE瀏覽器查看結(jié)果如圖1-9所示。

圖1-9 CDATA演示
在使用CDATA節(jié)時,應(yīng)注意以下幾個細(xì)節(jié)。
CDATA節(jié)可以在任何出現(xiàn)字符數(shù)據(jù)的地方使用,但不能出現(xiàn)在XML標(biāo)記中。
■ CDATA節(jié)必須包含在元素中。
■ CDATA節(jié)之間不能再包含CDATA節(jié)(不能嵌套)。
如下示例是格式不正確的。
<?xml version="1.0" encoding="GB2312"?> <files> <file> <!--包含在標(biāo)記中 --> <name <![CDATA[some description]]>>special.txt</name> <!--CDATA嵌套 --> <content><![CDATA[outer <![CDATA[inner]]> ]]></content> </file> </files>
1.3.6 處理指令
XML并不預(yù)先假設(shè)元素或者其內(nèi)容的處理辦法,這是XML的優(yōu)勢之處。在實際開發(fā)過程中,經(jīng)常需要把某些信息通過文檔傳遞給應(yīng)用程序,處理指令(Processing Instruction,PI)正是XML為此目的提供的一種機(jī)制。
處理指令的語法形式如下:
<? target instruction ?>
具體介紹如下。
target:指令所指向的應(yīng)用的名稱,是必需的部分,而且必須是有效的XML名稱。
■ instruction:一個字符串表示,它可能包含任何有效的字符(除了“?>”)。
可以把處理指令插入到XML文檔中除其他標(biāo)記之外的任何地方,也就是說,可以把它插入到與插入注釋相同的地方:在文檔的序言中、在文檔元素的后面或者在元素的內(nèi)容中。一個幾乎隨處可見的PI的用途就是將一個樣式單和XML數(shù)據(jù)對象關(guān)聯(lián)起來:
<?xml-stylesheet ...?>
下述代碼用于實現(xiàn)任務(wù)【描述1.D.6】,演示了處理指令的使用。
【描述1.D.6】 PI.xml
<?xml version="1.0" encoding="GB2312"?> <!-- 序言中的處理指令 --> <?xml-stylesheet type="text/css" href="student.css" ?> <students> <!-- 元素內(nèi)部的處理指令 --> <?ScriptA level="A" ?> <student sex = "male"> <name>Tom</name> <age>14</age> <tel>88889999</tel> </student> <student sex = 'female'> <name>Rose</name> <age>16</age> <tel>66667777</tel> </student> </students>
該XML文檔關(guān)聯(lián)了一個student.css文件,用于設(shè)置XML文檔中元素的樣式。代碼如下所示。
【描述1.D.6】 student.css
student{ display:block; margin-top:12pt; font-size:10pt } name{ font-style:italic; font-size:20pt } age{ font-weight:bold } tel{ font-size:20pt }
通過IE瀏覽器查看結(jié)果如圖1-10所示。

圖1-10 處理指令演示
在XML中使用PI有如下好處。
可以作為腳本或服務(wù)端包含文件的掛鉤(避免類似HTML語法中“<!-- -->”注釋語法的泛濫成災(zāi))。
■ 可以作為擴(kuò)展模式的機(jī)制(否則它們就不能被修改)。
■ 它是一種無須改變DTD認(rèn)證就可以擴(kuò)展文檔的方法。
■ 在不影響文檔結(jié)構(gòu)的情況下,通過在XML文件中嵌入處理指令,將信息以文檔的形式傳遞給應(yīng)用程序。
注意 處理指令不能放入XML標(biāo)記中聲明。
1.4 XML文檔規(guī)則
XML語法雖然簡單,但要遵循“良好格式”的規(guī)則才能編寫合法的XML應(yīng)用。
1.4.1 格式良好的XML文檔規(guī)則
1.必須有聲明語句
XML聲明是XML文檔的第一句,其格式如下:
<?xml version="1.0" standalone="yes/no" encoding="UTF-8"?>
XML聲明的作用是告訴瀏覽器或者其他處理程序:這個文檔是XML文檔。
2.注意大小寫
在XML文檔中,大小寫是有區(qū)別的。“<P>”和“<p>”是不同的標(biāo)記。注意在寫元素時,前后標(biāo)記大小寫要保持一致。例如:<Author>TOM</Author>,寫成<Author>TOM</author>是錯誤的。
最好養(yǎng)成一種習(xí)慣,在輸入標(biāo)記時或者全部大寫,或者全部小寫,或者第一個字母大寫,這樣可以減少因為大小寫不匹配而產(chǎn)生的文檔錯誤。
3.XML文檔有且只有一個根元素
良好格式的XML文檔必須有一個根元素,也就是緊接著聲明后面建立的第一個元素,其他元素都是這個根元素的子元素,根元素完全包括文檔中其他所有的元素。根元素的起始標(biāo)記要放在其他所有元素的起始標(biāo)記之前;根元素的結(jié)束標(biāo)記要放在其他所有元素的結(jié)束標(biāo)記之后。
4.屬性值使用引號
在HTML代碼里面,屬性值加不加引號都可以。例如:“<font color=red>word</font>”和“<font color="red">word</font>”都可以被瀏覽器正確解釋。但是XML中規(guī)定所有屬性值必須加引號(可以是單引號,也可以是雙引號,建議使用雙引號),否則將被視為錯誤。
5.所有的標(biāo)記必須有相應(yīng)的結(jié)束標(biāo)記
在HTML中,標(biāo)記可以不成對出現(xiàn),而在XML中,所有標(biāo)記必須成對出現(xiàn),有一個起始標(biāo)記,就必須有一個結(jié)束標(biāo)記,否則將被視為錯誤。
6.所有的空標(biāo)記也必須被關(guān)閉
空標(biāo)記就是標(biāo)記對之間沒有內(nèi)容的標(biāo)記。比如“<img>”等標(biāo)記。在XML中,規(guī)定所有的標(biāo)記必須有結(jié)束標(biāo)記。
7.標(biāo)記必須正確嵌套
標(biāo)記之間不得交叉。在HTML文件中,可以這樣寫:
<B><H>Today is Saturday.</B></H>
<B>和<H>標(biāo)記之間有相互重疊的區(qū)域,而在XML中是嚴(yán)格禁止這樣標(biāo)記交錯的寫法,標(biāo)記必須以規(guī)則性的次序出現(xiàn)。
8.處理特殊字符
在XML文檔中,如果要用到特殊字符,必須用相應(yīng)符號代替,如“<”已作為標(biāo)簽使用,不能出現(xiàn)在XML文檔中,應(yīng)以相應(yīng)的實體引用代替。
對于空白字符,XML的處理方式和HTML不一樣。HTML標(biāo)準(zhǔn)規(guī)定,不管有多少個空格,都當(dāng)做一個空格來處理。例如在HTML中,“Today is Saturday.”將會被顯示成“Today is Saturday.”,HTML解析器會自動把句子中多余的空格部分去掉。
而在XML中規(guī)定,所有標(biāo)記以外的空格,解析器都要全部交給應(yīng)用程序處理,即解析器會保留內(nèi)容中所有的空格字符并不加修改地傳遞給應(yīng)用程序。
1.4.2 格式良好的XML文檔
一個遵守XML語法規(guī)則,并遵守XML規(guī)范的文檔稱之為格式良好的XML(Well-formed XML)。XML必須是格式良好的,才能夠被解析器正確地解析出來。一個格式良好的XML文檔需滿足下列條件。
語法合乎XML規(guī)范。
■ 元素構(gòu)成一個層次樹,只有一個根結(jié)點。
■ 除非提供了DTD,否則沒有對外部實體的引用。
1.4.3 有效的XML文檔
在XML文檔中,用的大多都是自定義的標(biāo)記。但是如果兩個同行業(yè)的公司A和B要用XML文檔相互交換數(shù)據(jù)的話,他們之間必須有一個約定——即可以用哪些標(biāo)記,父元素中能夠包括哪些子元素,各個元素出現(xiàn)的順序,元素中的屬性怎樣定義等,這樣雙方在用XML交換數(shù)據(jù)時才能夠暢通無阻。這種約定規(guī)則可以用DTD(Document Type Definition,文檔格式定義)或XML Schema(XML模式)來表述。
注意 XML Schema是基于XML的DTD的替代品,W3C使得DTD和Schema可以相互替代。關(guān)于DTD和Schema,將在后續(xù)章節(jié)詳細(xì)介紹。
一個有效的XML文檔首先應(yīng)該是一個格式良好的XML文檔,其次還必須符合DTD或是XML模式所定義的規(guī)則。所以說格式良好的XML文檔不一定是有效的XML文檔,但有效的XML文檔一定是格式良好的XML文檔。
下述代碼用于實現(xiàn)任務(wù)【描述1.D.7】,基于DTD,演示有效XML文檔的定義。
【描述1.D.7】 product.dtd
<?xml version="1.0" encoding="GB2312"?> <!ELEMENT PRODUCTS (PRODUCT)+> <!ELEMENT PRODUCT (PRODUCTNAME,DESCRIPTION,PRICE,QUANTITY)> <!ELEMENT PRODUCTNAME (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ELEMENT PRICE (#PCDATA)> <!ELEMENT QUANTITY (#PCDATA)> <!ATTLIST PRODUCT PRODUCTID ID #REQUIRED CATEGORY (BOOKS|TOYS) "TOYS">
下面的XML是一個應(yīng)用上述DTD文檔的有效的XML文檔。
【描述1.D.7】 product.xml
<?xml version="1.0" encoding="GB2312"?> <!DOCTYPE PRODUCTDATA SYSTEM "product.dtd"> <PRODUCTS> <PRODUCT PRODUCTID="P001" CATEGORY="TOYS"> <PRODUCTNAME>亂世佳人</PRODUCTNAME> <DESCRIPTION>以美國內(nèi)戰(zhàn)為背景進(jìn)行敘事</DESCRIPTION> <PRICE>26.80</PRICE> <QUANTITY>60</QUANTITY> </PRODUCT> </PRODUCTS>
通過IE瀏覽器查看結(jié)果如圖1-11所示。

圖1-11 DTD演示
DTD定義了XML文檔中可用的合法元素。它通過定義一系列合法的元素決定了XML文檔的內(nèi)部結(jié)構(gòu)。
小結(jié)
通過本章的學(xué)習(xí),學(xué)生應(yīng)該能夠?qū)W會:
XML是一種類似于HTML的標(biāo)記語言,是一種元標(biāo)記語言。
■ XML是用來描述數(shù)據(jù)的,不是HTML的替代品。
■ XML的標(biāo)記不是在XML中預(yù)定義的,用戶可以自定義標(biāo)記。
■ XML有兩個先驅(qū):SGML和HTML,XML正是為了解決它們的不足而誕生的,XML是一個精簡的SGML子集。
■ XML文檔有兩個主要組成部分:序言和根元素。
■ XML文檔內(nèi)容的主體部分一般由根元素、子元素、屬性、注釋和內(nèi)容組成。
■ 元素是XML文檔的基本組成部分。它們可以包含其他的元素、字符數(shù)據(jù)、字符引用、實體引用、PI、注釋或CDATA部分。
■ 字符引用和實體引用是XML處理特殊字符的兩種方式。
■ 引入CDATA節(jié)可以描述除了“]]>”之外的任意字符串。
■ 處理指令可以把某些信息以文檔的形式傳遞給應(yīng)用程序。
■ XML必須是格式良好的,才能夠被解析器正確地解析。
■ 一個有效的XML文檔應(yīng)該既是格式良好的,同時還必須是符合DTD或是XML Schema所定義規(guī)則的XML文檔。
練習(xí)
1.屬性______用來表示XML文檔所使用的字符集。
A.version B.encoding C.standalone D.language
2.含有簡體中文字符的XML文檔中,encoding屬性值可設(shè)為______。(多選)
A.UTF-8 B.BIG5 C.GB2312 D.ISO-8859-1
3.實體引用前面帶有一個符號______。
A.& B.# C.+ D.;
4.下述關(guān)于XML文檔的描述正確的是______。(多選)
A.XML不區(qū)分大小寫
B.任何XML文檔有且只有一個根元素
C.XML中的標(biāo)記可以沒有結(jié)束標(biāo)記
D.在合適的位置,引入CDATA節(jié)可以描述除了“]]>”之外的任意字符串
5.每個XML文檔都分為兩個部分:______和______;
<?xml version="1.0" encoding="gb2312"?>是一個______。
6.XML中一共有四類元素,分別是______、______、______和______。
7.XML文檔內(nèi)容的主體部分,一般由_______、_______、_______、注釋和內(nèi)容組成。
8.XML是從______擴(kuò)展來的。
9.使用XML的優(yōu)點是什么?
10.相對于EDI的結(jié)構(gòu)化信息技術(shù)而言,XML的優(yōu)勢有哪些?
11.簡要描述XML的命名規(guī)范。
12.簡要描述格式良好的XML文檔應(yīng)遵循的規(guī)則。
- 基于C語言的程序設(shè)計
- 計算機(jī)應(yīng)用
- Getting Started with Oracle SOA B2B Integration:A Hands-On Tutorial
- Grome Terrain Modeling with Ogre3D,UDK,and Unity3D
- 網(wǎng)中之我:何明升網(wǎng)絡(luò)社會論稿
- 網(wǎng)絡(luò)安全技術(shù)及應(yīng)用
- 典型Hadoop云計算
- Redash v5 Quick Start Guide
- WPF專業(yè)編程指南
- 基于元胞自動機(jī)的人群疏散系統(tǒng)建模與分析
- Spark Streaming實時流式大數(shù)據(jù)處理實戰(zhàn)
- 巧學(xué)活用Photoshop
- 輸送技術(shù)、設(shè)備與工業(yè)應(yīng)用
- 案例解說虛擬儀器典型控制應(yīng)用
- 案例解說單片機(jī)C語言開發(fā)