![《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第1頁](http://file4.renrendoc.com/view12/M05/18/21/wKhkGWdNYpuAZyCrAAO8_ZsOxdE937.jpg)
![《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第2頁](http://file4.renrendoc.com/view12/M05/18/21/wKhkGWdNYpuAZyCrAAO8_ZsOxdE9372.jpg)
![《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第3頁](http://file4.renrendoc.com/view12/M05/18/21/wKhkGWdNYpuAZyCrAAO8_ZsOxdE9373.jpg)
![《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第4頁](http://file4.renrendoc.com/view12/M05/18/21/wKhkGWdNYpuAZyCrAAO8_ZsOxdE9374.jpg)
![《Web網(wǎng)站設(shè)計與開發(fā)教程》課件第5章_第5頁](http://file4.renrendoc.com/view12/M05/18/21/wKhkGWdNYpuAZyCrAAO8_ZsOxdE9375.jpg)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度機場廣告牌設(shè)計與安裝工程合同
- 2025年度公建房屋租賃與能耗管理一體化合同
- 2025年國際貿(mào)易合同擔(dān)保操作手冊
- 2025年度跨區(qū)域過橋墊資服務(wù)合同模板
- 2025年度學(xué)校食堂食品安全風(fēng)險評估合同
- 2025年度建筑項目居間傭金合同范本
- 2025年度化工廠安全生產(chǎn)設(shè)施設(shè)備租賃合同
- 2025年度企業(yè)總部辦公場地租賃合同
- 2025年度智慧城市建設(shè)方案設(shè)計與實施合同
- 2025年度空調(diào)設(shè)備租賃與維保一體化服務(wù)合同范本
- 2024年資格考試-對外漢語教師資格證筆試參考題庫含答案
- 2024年4月自考02382管理信息系統(tǒng)答案及評分參考
- (蘇版)初三化學(xué)上冊:第2單元課題1空氣
- 2023年12月廣東珠海市軌道交通局公開招聘工作人員1人筆試近6年高頻考題難、易錯點薈萃答案帶詳解附后
- 腹腔鏡腎上腺腫瘤切除術(shù)查房護理課件
- 燃氣罩式爐應(yīng)急預(yù)案
- 專題23平拋運動臨界問題相遇問題類平拋運和斜拋運動
- 超聲科醫(yī)德醫(yī)風(fēng)制度內(nèi)容
- 高三開學(xué)收心班會課件
- 蒸汽換算計算表
- 四年級計算題大全(列豎式計算,可打印)
評論
0/150
提交評論