官术网_书友最值得收藏!

第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)符號“?”編碼成“&#169;”。以“&#”開始并以“;”結(jié)束的引用都是字符引用。中間的數(shù)字是所需字符的Unicode編碼,如果編碼寫成十六進(jìn)制形式,應(yīng)該使用一個“x”作為前綴,比如“&#169;”也可表示為“&#xA9;”。下述代碼是兩個示例:

&#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>&#169;</ch>
    <ch>&#xA9;</ch>
    <ch>&#174;</ch>
    <ch>&#xAE;</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>&quot;</ch>
    <ch>&apos;</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 &quot; &apos; < > & </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ī)則。

主站蜘蛛池模板: 沈阳市| 宜兰市| 开江县| 长岛县| 佛山市| 碌曲县| 红原县| 周宁县| 江孜县| 贞丰县| 营山县| 武胜县| 和林格尔县| 自治县| 广南县| 莱州市| 清徐县| 施秉县| 曲靖市| 牙克石市| 荔波县| 宣化县| 项城市| 乐清市| 万州区| 堆龙德庆县| 醴陵市| 乌海市| 南城县| 龙州县| 自治县| 永年县| 运城市| 阜新市| 高邮市| 卫辉市| 尉氏县| 武鸣县| 南涧| 洛南县| 阳谷县|