《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第1頁
《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第2頁
《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第3頁
《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第4頁
《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章數(shù)據(jù)查詢5.1XML簡介5.2XML語法與結(jié)構(gòu)5.3命名空間5.4文檔類型定義與校驗5.5XML文檔樣式轉(zhuǎn)換5.6XML文檔的解析

【學(xué)習(xí)提示】與網(wǎng)站設(shè)計技術(shù)剛剛興起的時候不同,現(xiàn)在學(xué)習(xí)網(wǎng)站設(shè)計已經(jīng)無法繞開XML技術(shù)了。從名字就可以看出,XML與HTML有一定的相關(guān)性,它們都來自同一家族——SGML。隨著網(wǎng)站技術(shù)的廣泛應(yīng)用,單純的HTML已無法滿足應(yīng)用的需求,XML技術(shù)臨危受命,擔(dān)當(dāng)起打破技術(shù)瓶頸、提供擴展能力的重要角色。

目前,XML不僅在網(wǎng)站設(shè)計的前臺、后臺發(fā)揮著重要的作用,而且已廣泛應(yīng)用于互聯(lián)網(wǎng)、物聯(lián)網(wǎng)、大數(shù)據(jù)和云計算等重要領(lǐng)域。

為了使異構(gòu)系統(tǒng)間的數(shù)據(jù)交換更加容易實現(xiàn),W3C于1998年正式推出了可擴展標(biāo)記語言(ExtensibleMarkupLanguage,XML)。作為標(biāo)準(zhǔn)通用標(biāo)記語言(SGML)經(jīng)過優(yōu)化后的一個子集,XML具有簡明的結(jié)構(gòu)、良好的可擴展性、通用性和開放性,因而逐步成為信息交換和共享的重要手段。目前,XML已被廣泛地應(yīng)用于網(wǎng)站開發(fā)中的許多環(huán)節(jié),包括服務(wù)器配置、業(yè)務(wù)流程描述、程序代碼編寫和數(shù)據(jù)庫接口設(shè)計等方面。5.1XML簡介

XML的產(chǎn)生與HTML在應(yīng)用過程中產(chǎn)生的瓶頸問題直接相關(guān)。雖然HTML是Web的“數(shù)據(jù)類型”,但同時還具有如下不足:

(1)

HTML是專門為描述主頁的表現(xiàn)形式而設(shè)計的,它疏于對信息語義及其內(nèi)部結(jié)構(gòu)的描述,不能適應(yīng)日益增多的信息檢索要求和存儲要求。

(2)

HTML對形式的描述能力實際也還是非常不夠的,它無法描述矢量圖形、科技符號和一些其他的特殊顯示效果。

(3)

HTML的標(biāo)簽日益臃腫,文件結(jié)構(gòu)混亂而缺乏條理,導(dǎo)致瀏覽器的設(shè)計越來越復(fù)雜。

HTML源自于SGML,且后者是描述各種電子文件結(jié)構(gòu)及內(nèi)容的成熟的國際標(biāo)準(zhǔn),因此SGML便很自然地成為解決HTML瓶頸問題的思路。但SGML并非為Internet應(yīng)用而設(shè)計,它的體系也太過復(fù)雜和龐大,很難被Internet所廣泛使用。于是,經(jīng)過多次國際會議和多個國際組織的努力,于1998年形成了針對Internet進行優(yōu)化的SGML“子集”——XML。XML去除了SGML的繁雜而保持其優(yōu)點,使其可以方便地應(yīng)用于各種基于Internet的系統(tǒng)中。

XML文檔的層次結(jié)構(gòu)容易被軟件所解析,同時,它還非常易于人的閱讀。圖5-1記事本中的代碼給出了一所大學(xué)的院系設(shè)置。

圖5-1典型的XML代碼

XML繼承了SGML具有的可擴展性、結(jié)構(gòu)性及可校驗性,這也是與HTML的主要區(qū)別:

(1)可擴展性方面:HTML不允許用戶自定義標(biāo)識或?qū)傩?;而在XML中,用戶能夠根據(jù)需要自行定義新的標(biāo)識和屬性名,以便更好地從語義上修飾數(shù)據(jù)。

(2)結(jié)構(gòu)性方面:HTML不支持深層的結(jié)構(gòu)描述;而XML的文件結(jié)構(gòu)嵌套可以復(fù)雜到任意程度。

(3)可校驗性方面:傳統(tǒng)的HTML沒有提供規(guī)范文件以支持應(yīng)用軟件對HTML文件進行結(jié)構(gòu)校驗;而XML文件可以包括一個語法描述,使應(yīng)用程序可以對此文件進行結(jié)構(gòu)確認。雖然XML較HTML具有很多優(yōu)勢,但這并不能得到“XML將取代HTML”的結(jié)論。雖然XML也可以用來描述表現(xiàn)形式,但這種描述的方式(具體的標(biāo)簽和語法)也必須通過標(biāo)準(zhǔn)固定下來,而HTML就是這種完成特定任務(wù)的“固化”的標(biāo)準(zhǔn)。事實上,W3C確實制定了一個應(yīng)用標(biāo)準(zhǔn)——XHTML,用以規(guī)范網(wǎng)頁設(shè)計。

由于XML的開放特性,任何一個信息發(fā)布者(包括企業(yè)或個人)都可以制定自己的信息描述標(biāo)準(zhǔn)并按這一標(biāo)準(zhǔn)提交XML文檔,這會造成相同信息內(nèi)容的不同格式版本,文檔之間也難以相互兼容。這種結(jié)果必然制約XML的通用性,阻礙信息的交流。因此,根據(jù)不同行業(yè)的特點制定一系列XML應(yīng)用標(biāo)準(zhǔn)是很有必要的。

XML的技術(shù)標(biāo)準(zhǔn)可分為三個層次:元語言標(biāo)準(zhǔn)、基礎(chǔ)標(biāo)準(zhǔn)和應(yīng)用標(biāo)準(zhǔn),如圖5-2所示。其中,元語言標(biāo)準(zhǔn)是整個體系的核心,包含了XML從SGML中繼承和擴展的語言特性;基礎(chǔ)標(biāo)準(zhǔn)規(guī)定了XML中的公用特征,如命名空間(Namespace)、XML聯(lián)接(XLink)、架構(gòu)(Schema)以及文檔對象模型(DOM)等,它們是進一步建立

XML應(yīng)用標(biāo)準(zhǔn)的基礎(chǔ);應(yīng)用標(biāo)準(zhǔn)是基于文檔特性、應(yīng)用環(huán)境和使用方式等特點制定的實用化標(biāo)準(zhǔn)。制定XML應(yīng)用標(biāo)準(zhǔn)是一個非常龐大的工程,它涉及XML的體系結(jié)構(gòu)、應(yīng)用環(huán)境以及行業(yè)特點等問題。因此,許多企業(yè)、行業(yè)協(xié)會和政府部門都參與了標(biāo)準(zhǔn)的制定,并針對不同的應(yīng)用環(huán)境推出了大量的標(biāo)準(zhǔn)。

圖5-2XML技術(shù)標(biāo)準(zhǔn)體系

5.2.1處理指令

XML的處理指令是用來給處理XML文檔的應(yīng)用程序提供信息的。處理指令遵循下面的格式:

<?指令名指令信息?>

例如:

<?xmlversion="1.0"encoding="GB2312“standalone="yes"?>

<?xml-stylesheettype="text/xsl"href="mystyle.xsl"?>5.2XML語法與結(jié)構(gòu)例子中的第一個處理指令是由<?xml>標(biāo)簽描述的XML聲明,其中的信息為:該文檔遵守XML版本1.0,所使用的編碼方式為GB2312(默認為UTF-8);Standalone屬性說明文檔不需要從外部導(dǎo)入文件。例子中的第二個處理指令指定與XML文件配套使用XSL文件mystyle.xsl。5.2.2XML元素

XML文檔的基本單位是元素。元素是一個信息塊,它由一個元素名和一個元素內(nèi)容構(gòu)成。元素的名稱還應(yīng)遵守如下規(guī)則:

●元素名稱中可以包含字母、數(shù)字以及其他字符;

●元素名稱不能以數(shù)字或“_”(下劃線)開頭;

●元素名稱不能以“xml”(包括其各種大小寫形式)開頭;

●元素名稱中不能包含空格;●元素名稱中間不能包含“:”(冒號)。

每一個XML文檔都有一個根元素,或稱作文檔元素,如下面代碼中的<Sections>。

<?xmlversion=“1.0”?>

<Sections>

<ado>

<code>SourceCodeSectionofC-SharpCorner</code>

<articles>SourceCodeSectionofC-SharpCorner</articles>

</ado>

<Graphics>

<code>GDI+sourceCodeSectionofC-SharpCorner</code>

<articles>SourceCodeSectionofC-SharpCorner</articles>

</Graphics>

</Sections>按照XML元素所包含的內(nèi)容,可以將XML元素分為以下四種形式:

●包含數(shù)據(jù)內(nèi)容的元素:這些元素中只包含數(shù)據(jù)。例如:<x>abc</x>。

●包含子元素內(nèi)容的元素:元素包含一個或多個子元素。例如:<x><y></y></x>。

●空元素:元素中既不包含數(shù)據(jù)內(nèi)容又不包含子元素。例如:<x></x>,可以簡寫為<x/>。

●包含混合內(nèi)容的元素:元素既包含數(shù)據(jù)內(nèi)容又包含子元素。例如:<x>abc<y>

</y></x>。

元素中的數(shù)據(jù)內(nèi)容通常是一般的字符串,但如果這些字符串的內(nèi)容與XML文檔本身會產(chǎn)生二義性,則需要采用CDATA(characterdata)來聲明。例如:

<x><![CDATA[<AUTHORname="Joey"></AUTHOR>]]></x>

通過這種方式,將整個字符串“<AUTHORname="Joey"></AUTHOR>”聲明為<x>元素的數(shù)據(jù)內(nèi)容。

空元素看似沒有實質(zhì)意義,但與元素屬性配合則可描述具有一定特征的元素。另外,雖然XML的語法支持包含混合內(nèi)容的元素,但這種形式在數(shù)據(jù)語義上容易造成混亂,不建議使用。

XML與HTML有很多相似性,但在語法上XML比HTML更為嚴格。所以,在編寫XML文檔時需要注意下列細節(jié):

●XML是對大小寫敏感的,如<table>和<TABLE>是不同的元素;

●XML的每一個標(biāo)簽都必須有對應(yīng)的結(jié)束標(biāo)簽,即使是空元素也必須要寫一對標(biāo)簽。

●XML中的元素之間可以嵌套而形成子元素,但不能交叉。例如,<b><i>Thistextisboldanditalic</b></i>在XML的語法中是錯誤的。

●空格也可以是XML文檔的數(shù)據(jù)內(nèi)容。5.2.3元素屬性

XML屬性提供一種定義復(fù)雜元素的解決方案。屬性由屬性名和屬性值組成。元素的屬性說明只能在元素起始標(biāo)簽或空元素標(biāo)簽中出現(xiàn),屬性值必須放置在一對雙引號中,例如:

<codelanguage="C#">SourceCodeSectionofC-SharpCorner</code>

與元素名一樣,屬性名也對大小寫敏感。如果屬性名為“ID”,則說明該屬性可以作為元素的索引。

對于XML元素來說,屬性并不是必需的。有時也可以將相同的信息放到一個子元素中,但對于比較小的上下文信息,使用屬性比使用子元素更方便,而且表達的意思也更清晰。

命名空間(Namespaces)是XML規(guī)范的重要組成部分,它增強了對XML元素或?qū)傩缘拿绞健2捎妹臻g方式后,XML的元素名稱將由一個前綴名稱和一個本地名稱組成,它們用冒號分隔。前綴名稱映射到指定的統(tǒng)一資源標(biāo)識符(URI),而在同一個URI中再定義唯一的本地名稱,這樣的組合可以生成互聯(lián)網(wǎng)中的唯一名稱。5.3命名空間有兩種類型的URI——統(tǒng)一資源定位器(URL)和統(tǒng)一資源名稱(URN)都可以用作命名空間標(biāo)識符,其中URL的方式更為常用。命名空間標(biāo)識符僅僅是字符串,并不代表在互聯(lián)網(wǎng)中可以訪問到相應(yīng)的資源。當(dāng)兩個命名空間標(biāo)識符中的各個字符都完全相同時,它們就被視為相同的。

命名空間的語法如下:

xmlns:[prefix]="[urlofname]"

其中,“xmlns:”是必需的屬性,“prefix”是命名空間的別名。例如:

<samplexmlns:ins=".ac">

<ins:batch-list>

<ins:batch>EveningBatch</ins:batch>

</ins:batch-list>

</sample>

可以看出,batch-list、batch等標(biāo)簽在“.ac”空間中定義,別名為ins。也可以使用默認命名空間的聲明方式,語法如下:

xmlns="<namespaceidentifier>"

一個XML文檔中可以有多個命名空間,通過默認命名空間的聲明,其作用域中的所有非限定元素名稱都將自動與指定的命名空間標(biāo)識符相關(guān)聯(lián)。下面的代碼使用了默認命名空間。

<d:studentxmlns:d="/student"

xmlns="urn:foo"code="3235329">

<name>JeffSmith</name>

<languagexmlns=''>C#</language>

<rating>35</rating>

</d:student>

在這里,“student”來自/student命名空間,而“name”和“rating”來自默認命名空間urn:foo。code屬性不屬于命名空間,這是因為屬性不會自動與默認的命名空間標(biāo)識符相關(guān)聯(lián)。

驗證文檔有助于防止數(shù)據(jù)與具有特定結(jié)構(gòu)的應(yīng)用程序進行交互時出現(xiàn)問題,可以幫助應(yīng)用程序?qū)ML文檔的結(jié)構(gòu)進行校驗。最初的XML1.0推薦標(biāo)準(zhǔn)包括對文檔類型定義的支持,隨后W3C通過XML架構(gòu)擴展了這種功能。5.4文檔類型定義與校驗5.4.1文檔類型定義DTD

文檔類型定義(DocumentTypeDefinition,DTD)是一套語法規(guī)則,它可以作為XML文檔的模板,同時也是XML文檔的有效性(valid)校驗標(biāo)準(zhǔn)。在DTD中可以定義一系列文檔規(guī)則,包括文檔中的元素及其順序、屬性等。當(dāng)我們打開很多網(wǎng)站的頁面源代碼時,可能會看到HTML文檔的第一行文字如下:

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"

"/TR/xhtml1/DTD/xhtml1-transitional.dtd">

這便是XHTML的文檔類型定義聲明,瀏覽器根據(jù)這一聲明決定如何解析頁面元素。

例如,假定要使用以下XML詞匯描述員工信息:

<employeeid="555-12-3434">

<name>Mike</name>

<hiredate>2007-12-02</hiredate>

<salary>42000.00</salary>

</employee>以下DTD文檔描述了XML文檔的結(jié)構(gòu):

<!--employee.dtd-->

<!ELEMENTemployee(name,hiredate,salary)>

<!ATTLISTemployee

idCDATA#REQUIRED>

<!ELEMENTname(#PCDATA)>

<!ELEMENThiredate(#PCDATA)>

<!ELEMENTsalary(#PCDATA)>

然后,該DTD能夠通過一個DOCTYPE聲明和原始文檔相關(guān)聯(lián),如下:

<!DOCTYPEemployeeSYSTEM"employee.dtd">

<employeeid="555-12-3434">

<name>Monica</name>

<hiredate>1997-12-02</hiredate>

<salary>42000.00</salary>

</employee>

可以看到,DTD提供了精確的形式語言用以描述XML文檔中的數(shù)據(jù)元素。在DTD中,每個元素聲明都以“<!ELEMENT”開始,以“>”結(jié)束,它定義了元素及其內(nèi)容。元素內(nèi)容可以是數(shù)據(jù)內(nèi)容、子元素內(nèi)容、空元素或混合內(nèi)容。

DTD采用樹狀結(jié)構(gòu)來說明數(shù)據(jù)元素之間的層次關(guān)系(或從屬關(guān)系),并且明確定義了同層元素之間的順序以及元素重復(fù)規(guī)則,如規(guī)定子元素可以出現(xiàn)一次或多次(+)、零次或多次(*)以及零次或一次(?)。沒有這樣的操作符意味著子元素必須恰好出現(xiàn)一次。例如:

<!ELEMENTauthors(author+)>說明至少包含一個作者

<!ELEMENTreferences(reference*)>說明可以包含多篇參考文獻,但也可以沒有

<!ELEMENTauthor(name,address,resume?)>說明作者的簡歷可有可無

元素中的子元素也可以采用枚舉的方式來規(guī)定,表示元素必須包含枚舉列表中的一個子元素。例如:

<!ELEMENTPayment(Cash|Check|Card)>

表示Payment元素必須包含Cash、Check或Card中的任意一個。

DTD不僅可以定義元素結(jié)構(gòu),還可以定義元素的屬性。屬性的定義都是以“<!ATTLIST”開始,“>”結(jié)束。在屬性聲明中可以包含四個部分:元素名、屬性名、屬性類型和默認值。在屬性聲明中,#REQUIRED表示文檔必須提供此屬性的屬性值;#IMPLIED表示不必一定為屬性賦值;#FIXED規(guī)定如果要為此屬性賦值就必須使用默認值,因此#FIXED必須與默認值配合使用。

下面的代碼給出了一個針對訂單文檔較完整的DTD定義。

<!--DTDExampleforOrder-->

<!ELEMENTOrder(Addresses,LineItems,Payment)>

<!ATTLISTOrder

source(web|phone|retail)#REQUIRED

customerType(consumer|business)"consumer"

currencyCDATA"USD">

<!--CollectionofAddresses-->

<!ELEMENTAddresses(Address+)>

<!--AddressStructure-->

<!ELEMENTAddress(FirstName,MiddleName?,LastName,Street+,City,State,Postal,Country)>

<!ATTLISTAddressaddType(bill|ship|billship)"billship">

<!ELEMENTFirstName(#PCDATA)>

<!ELEMENTMiddleName(#PCDATA)>

<!ELEMENTLastName(#PCDATA)>

<!ELEMENTStreet(#PCDATA)>

<!ATTLISTStreetlineOrderCDATA#IMPLIED>

<!ELEMENTCity(#PCDATA)>

<!ELEMENTState(#PCDATA)>

<!ELEMENTPostal(#PCDATA)>

<!ELEMENTCountry(#PCDATA)>

<!--CollectionofLineItems-->

<!ELEMENTLineItems(LineItem+)>

<!--LineItemStructure-->

<!ELEMENTLineItem(Product,Quantity,UnitPrice)>

<!ATTLISTLineItemIDID#REQUIRED>

<!ELEMENTProduct(#PCDATA)>

<!ATTLISTProductcategory(CDROM|MBoard|RAM)#REQUIRED>

<!ELEMENTQuantity(#PCDATA)>

<!ELEMENTUnitPrice(#PCDATA)>

<!--PaymentStructure-->

<!ELEMENTPayment(Card|PO)>

<!--CardStructure-->

<!ELEMENTCard(CardHolder,Number,Expiration)>

<!ATTLISTCardcardType(VISA|MasterCard|Amex)#REQUIRED>

<!ELEMENTCardHolder(#PCDATA)>

<!ELEMENTNumber(#PCDATA)>

<!ELEMENTExpiration(#PCDATA)>

<!--POStructure-->

<!ELEMENTPO(Number,Authorization*)>

<!ELEMENTNumber(#PCDATA)>

<!ELEMENTAuthorization(#PCDATA)>

由上可以看出,使用DTD可定義非常復(fù)雜的XML文檔規(guī)則,這也是XML被廣泛使用的技術(shù)基礎(chǔ)。同時,校驗功能也是使用DTD的主要優(yōu)勢。當(dāng)XML解析器讀取該XML文檔時,它也能夠分析該文檔是否符合所關(guān)聯(lián)的DTD的定義。由于DTD語法本身不符合XML的語法規(guī)范,所以不能使用標(biāo)準(zhǔn)的XML解析器來處理DTD文檔?;赬ML的文檔定義方式——XML架構(gòu)的產(chǎn)生彌補了這一缺陷。5.4.2XML架構(gòu)XMLSchema

XML架構(gòu)(XMLSchema)是一種文檔類型定義方式,與DTD的最大區(qū)別在于XML架構(gòu)本身就是XML文檔。XML架構(gòu)文檔之于XML實例文檔如同面向?qū)ο笙到y(tǒng)中對象類之于對象實例。因此,一個XML架構(gòu)文檔往往對應(yīng)了多個XML實例文檔。

架構(gòu)定義中使用的元素來自/2001/XMLSchema命名空間,為使用方便,通常將其賦予別名xsd。XML架構(gòu)文件的結(jié)構(gòu)如下:

<xsd:schemaxmlns:xsd="/2001/XMLSchema"

targetNamespace="/employee/">

<!--definitionsgohere-->

</xsd:schema>

XML架構(gòu)定義中必須具有一個xsd:schema根元素。根元素可包含的子元素包括xsd:element、xsd:attribute和xsd:complexType等。例如,我們要描述以下這類XML實例文檔:

<tns:employeexmlns:tns="/employee/"

tns:id="555-12-3434">

<tns:name>Monica</tns:name>

<tns:hiredate>1997-12-02</tns:hiredate>

<tns:salary>42000.00</tns:salary>

</tns:employee>

可以通過以下XML架構(gòu)文檔來定義:

<xsd:schemaxmlns:xsd="/2001/XMLSchema"

targetNamespace="/employee/">

<xsd:elementname="employee"/>

<xsd:elementname="name"/>

<xsd:elementname="hiredate"/>

<xsd:elementname="salary"/>

<xsd:attributename="id"/>

</xsd:schema>

其中,XML實例文檔的元素和屬性分別使用xsd:element和xsd:attribute元素來定義,而targetNamespace則定義了這些元素和屬性的命名空間。在使用XML架構(gòu)時,必須全面了解命名空間的作用機制。

XML架構(gòu)也可用來校驗XML的有效性。以下是JavaScript代碼所給出的一種使用MSXML4.0來實現(xiàn)這個功能的方法。

varsc=newActiveXObject("MSXML2.XMLSchemaCache.4.0");

sc.add("/employee/","employee.xsd");

vardom=newActiveXObject("MSXML2.DOMDocument.4.0");

dom.schemas=sc;

if(dom.load("employee.xml"))

WScript.echo("success:documentconformstoSchema");

else

WScript.echo("error:invalidinstance");

MSXML解析器是隨IE瀏覽器發(fā)布的,但不同版本的解析器在使用時稍有區(qū)別。

與DTD類似,XML架構(gòu)也可以用來定義層次結(jié)構(gòu)復(fù)雜的XML元素類型。例如,在DTD中定義一個元素如下:

<!ELEMENTemployee(name,hiredate,salary)>

該ELEMENT聲明定義一個employee元素,先包含一個name元素,然后是一個hiredate元素,最后是一個salary元素。使用XML架構(gòu)定義相同的元素需要如下代碼:

<xsd:schemaxmlns:xsd="/2001/XMLSchema"

xmlns:tns="/employee/"

targetNamespace="/employee/">

<xsd:elementname="employee">

<xsd:complexType>

<xsd:sequence>

<xsd:elementref="tns:name"/>

<xsd:elementref="tns:hiredate"/>

<xsd:elementref="tns:salary"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:elementname="name"/>

<xsd:elementname="hiredate"/>

<xsd:elementname="salary"/>

</xsd:schema>可以看出,XML架構(gòu)的描述較DTD而言要“繁瑣”一些,但“繁瑣”的方式卻可帶來更加靈活和強大的文檔定義功能。例如,XML架構(gòu)中可以使用更加豐富的數(shù)據(jù)類型,從而子元素的出現(xiàn)次數(shù)和排序的定義也更加靈活,代碼的重用性和可維護性也隨之提高。

5.5.1在XML中使用CSS

HTML將數(shù)據(jù)內(nèi)容與表現(xiàn)融為一體,而XML主要用于數(shù)據(jù)內(nèi)容的描述。但當(dāng)用戶希望以一定方式(如網(wǎng)頁方式)觀看數(shù)據(jù)時,就需要將XML的表現(xiàn)方式與其內(nèi)容進行結(jié)合。使用CSS可以為XML文檔提供樣式描述。5.5XML文檔樣式轉(zhuǎn)換例如,下面為一個關(guān)于音樂CD的XML文檔(cd_catalog.xml):

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<CATALOG>

<CD>

<TITLE>EmpireBurlesque</TITLE>

<ARTIST>BobDylan</ARTIST>

<COUNTRY>USA</COUNTRY>

<COMPANY>Columbia</COMPANY>

<PRICE>10.90</PRICE>

<YEAR>1985</YEAR>

</CD>

<CD>

<TITLE>Hideyourheart</TITLE>

<ARTIST>BonnieTyler</ARTIST>

<COUNTRY>UK</COUNTRY>

<COMPANY>CBSRecords</COMPANY>

<PRICE>9.90</PRICE>

<YEAR>1988</YEAR>

</CD>

</CATALOG>針對這一XML文檔建立一個CSS文件(cd_catalog.css)來說明各個標(biāo)簽的顯示方式。其內(nèi)容如下:

CATALOG{background-color:#ffffff;width:100%;}

CD{display:block;margin-bottom:30pt;margin-left:0;}

TITLE{color:#FF0000;font-size:20pt;}

ARTIST{color:#0000FF;font-size:20pt;}

COUNTRY,PRICE,YEAR,COMPANY

{

display:block;

color:#000000;

margin-left:20pt;

}

在cd_catalog.xml文件中添加CSS說明指令,形成以下文件:

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<?xml-stylesheettype="text/css"href="cd_catalog.css"?>

<CATALOG>

</CATALOG>

在瀏覽器中展現(xiàn)該XML文檔,其結(jié)果如圖5-3所示。

圖5-3XML加上CSS文件在瀏覽器中的顯示

可以看出,應(yīng)用CSS可以描述XML文檔的樣式,但其效果較為簡單。更符合XML自身特點的樣式描述可以由XSL來完成。5.5.2在XML中使用XSL

可擴展樣式語言(XMLStyleLanguage,XSL)可以將XML文件作為原料,使用選擇、測試和匹配等方式,將XML轉(zhuǎn)換為目標(biāo)文檔,如HTML。

要從XML中提取相關(guān)的數(shù)據(jù)進行樣式轉(zhuǎn)換,就要用到XSL提供的模式查詢語言。所謂模式查詢語言,就是通過相關(guān)的模式匹配規(guī)則表達式從XML里提取數(shù)據(jù)的特定語句。模式查詢語言可分為三種:

●選擇模式:<xsl:for-each>、<xsl:value-of>和<xsl:apply-templates>。

●測試模式:<xsl:if>和<xsl:when>。●匹配模式:<xsl:template>。

選擇模式語句將數(shù)據(jù)從XML中提取出來,是一種簡單獲得數(shù)據(jù)的方法。選擇模式語句的元素中都有select屬性,它設(shè)定了選擇的條件。應(yīng)用XSL選擇模式語句找出文檔中滿足設(shè)定條件的元素或元素的集合進行樣式轉(zhuǎn)換。

例如在XML中有這樣的數(shù)據(jù):

<author>

<name>春華</name>

<name>秋實</name>

<name>橡果</name>

</author>我們要讀取這三個作者名字,可以按“author/name”方法一個一個地讀取,但如果文檔中有多個name元素就會變得非常繁瑣,XSL提供了簡化這種存取數(shù)據(jù)的語句:<xsl:for-each>。<xsl:for-each>語法如下:

<xsl:for-eachselect="pattern"order-by="sort-criteria-list">

用<xsl:for-each>語法讀取這三個作者名字的方法如下:

<xsl:for-eachselect="author/name">

<!--樣式定義-->

</xsl:for-each>

<xsl:for-each>模式只是選取標(biāo)簽,并沒有取出標(biāo)簽的內(nèi)容,接著就可以用<xsl:value-of>來獲取標(biāo)簽的內(nèi)容。<xsl:value-of>語法如下:

<xsl:value-ofselect="pattern">

仍以音樂CD的XML文檔為例,可以采用XSL對文件進行樣式轉(zhuǎn)換。XML文檔如下:

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<?xml:stylesheettype="text/xsl"href="cd_catalog.xsl"?>

<catalog>

<cd>

<title>EmpireBurlesque</title>

<artist>BobDylan</artist>

<country>USA</country>

<company>Columbia</company>

<price>10.90</price>

<year>1985</year>

</cd>

<cd>

<title>Hideyourheart</title>

<artist>BonnieTyler</artist>

<country>UK</country>

<company>CBSRecords</company>

<price>9.90</price>

<year>1988</year>

</cd>

</catalog>

新建文件cd_catalog.xsl,其內(nèi)容如下:

<?xmlversion="1.0"encoding="ISO-8859-1"?>

<xsl:stylesheetversion="1.0"xmlns:xsl="/1999/XSL/Transform">

<xsl:templatematch="/">

<html>

<body>

<h2>MyCDCollection</h2>

<tableborder="1">

<trbgcolor="#9acd32">

<th>Title</th>

<th>Artist</th>

</tr>

<xsl:for-eachselect="catalog/cd">

<tr>

<td><xsl:value-ofselect="title"/></td>

<td><xsl:value-ofselect="artist"/></td>

</tr>

</xsl:for-each>

</table>

</body>

</html>

</xsl:template>

</xsl:stylesheet>經(jīng)過XSL轉(zhuǎn)換后的結(jié)果如下,在瀏覽器中的顯示如圖5-4所示。

<html>

<body>

<h2>MyCDCollection</h2>

<tableborder="1">

<trbgcolor="#9acd32">

<th>Title</th>

<th>Artist</th>

</tr>

<tr>

<td>EmpireBurlesque</td>

<td>BobDylan</td>

</tr>

<tr>

<td>Hideyourheart</td>

<td>BonnieTyler</td>

</tr>

</table>

</body>

</html>

圖5-4XML文檔經(jīng)過XSL轉(zhuǎn)換后在瀏覽器中的顯示

5.6.1DOM解析器

文檔對象模型(DocumentObjectModel,DOM)是一個使程序和腳本有能力動態(tài)地訪問和更新XML文檔內(nèi)容、結(jié)構(gòu)以及樣式的平臺和語言中立的接口。DOM是對XML文檔樹形結(jié)構(gòu)的對象描述方法,樹的節(jié)點是一個個對象。通過存取這些對象就能夠存取XML文檔的內(nèi)容。根據(jù)DOM,XML文檔中的每個成分都是一個樹中的節(jié)點:5.6XML文檔的解析●整個XML文檔是一個文檔節(jié)點;

●每個XML標(biāo)簽是一個元素節(jié)點;

●包含在XML元素中的數(shù)據(jù)內(nèi)容是文本節(jié)點;

●每一個XML屬性是一個屬性節(jié)點;

●注釋屬于注釋節(jié)點。

在程序設(shè)計中,不同的XML解析器所提供的DOM類庫大致相同。以JAXP(JavaAPIforXMLProcessing)為例,DOM的基本對象主要有五個:Document、Node、NodeList、Element和Attr,如圖5-5所示。

圖5-5DOM的基本對象

Document對象代表了整個XML的文檔,所有其他的Node都以一定的順序包含在Document對象之內(nèi),排列成一個樹形的結(jié)構(gòu)。程序員可以通過遍歷這顆樹來得到XML文檔的所有內(nèi)容,這也是對XML文檔操作的起點。我們總是先通過解析XML源文件而得到一個Document對象,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論