明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

XML及其技術(shù)向?qū)?/h1>

[摘要]概要:本文介紹了XML以及XML家族中的各項(xiàng)技術(shù)。我們將討論這其中的各項(xiàng)核心技術(shù)是如何組合成一個(gè)完整的整體以及一些支持XML技術(shù)的東西究竟是什么。    似乎這樣的事情每天都在發(fā)生:越來(lái)越多的開(kāi)發(fā)者都相信XML(Extensible Markup Language)將從根本上改變我們的軟件業(yè)。但如...
概要:本文介紹了XML以及XML家族中的各項(xiàng)技術(shù)。我們將討論這其中的各項(xiàng)核心技術(shù)是如何組合成一個(gè)完整的整體以及一些支持XML技術(shù)的東西究竟是什么。

 
  似乎這樣的事情每天都在發(fā)生:越來(lái)越多的開(kāi)發(fā)者都相信XML(Extensible Markup Language)將從根本上改變我們的軟件業(yè)。但如果你想從他們那里弄清楚這一切為什么或是何時(shí)將會(huì)發(fā)生時(shí),你會(huì)發(fā)現(xiàn)他們給的解釋中充斥著大堆有關(guān)XML的專(zhuān)有名詞的縮寫(xiě)。這些東西實(shí)際上并不能讓你明白些什么,我相信你一定不會(huì)滿(mǎn)意像他們這樣的解釋。

  通常,人們?cè)趯W(xué)習(xí)掌握XML時(shí)所遇到的主要障礙來(lái)自于XML驚人的發(fā)展速度。如果你瀏覽一下W3C關(guān)于XML的網(wǎng)站(http://www.w4.org/xml/),你會(huì)發(fā)現(xiàn)有關(guān)XML的大量技術(shù)以及相關(guān)的出版物。W3C將如此大量的信息聚集在一起,給開(kāi)發(fā)者造成了不小的麻煩。在對(duì)"XML所含蓋的所用技術(shù)是如何整合在一起"這樣關(guān)鍵性的問(wèn)題還沒(méi)用明確概念的情況下,想要學(xué)習(xí)XML是比較困難的。

  本文向你介紹了XML和XML家族中的各項(xiàng)技術(shù),使你不僅在更高層次上對(duì)XML的重要性有所了解,而且知道XML中的各項(xiàng)技術(shù)是如何組合在一起成為一項(xiàng)完整的技術(shù)。讀完本文,你會(huì)將會(huì)對(duì)困擾你的那些XML專(zhuān)用名詞及其縮寫(xiě)用一個(gè)大致的了解,為你今后從更深層次學(xué)習(xí)XML打下基礎(chǔ)。

  那么,究竟什么是XML呢?

  在很多介紹以前的XML的作者中,回答這個(gè)問(wèn)題已經(jīng)成為了一種風(fēng)潮。就像你已經(jīng)熟知的一樣,XML是Extensible Markup Language的正式縮寫(xiě)。他們可能認(rèn)為XML的發(fā)音比EML讀起來(lái)更性感,于是就將原先的字母E換成了字母X。然而,當(dāng)你跨過(guò)縮寫(xiě)從更深層次上來(lái)理解XML時(shí),你會(huì)發(fā)現(xiàn)它不僅僅是一種標(biāo)記語(yǔ)言,而是一系列的技術(shù)。這一技術(shù)家族為我們開(kāi)發(fā)具用更好的可擴(kuò)展性和互操作性的軟件提供了一種解決方案。

  XML來(lái)自何處?

  XML起源于SGML(Standard Generalized Markup Language。換句話(huà)說(shuō),你可以既使用XML也可以使用SGML來(lái)創(chuàng)建自己的描述性文檔。這兩種語(yǔ)言都使用文本標(biāo)識(shí)(Tags)來(lái)描述數(shù)據(jù)以供其他應(yīng)用或是工具(例如一個(gè)SGML或是XML分析程序)使用。有了XML,它們可以正確的讀取信息并對(duì)數(shù)據(jù)進(jìn)行一些有趣的操作。XML是SGML的一個(gè)簡(jiǎn)化版本,它更適合于在Web上使用。

  XML的語(yǔ)法

  XML定義了用來(lái)描述你的數(shù)據(jù)的語(yǔ)法。一下就是一句正確的XML語(yǔ)句:

 。糷amburger name="CowBurger" lowfat="dream on"/>

  和其他的標(biāo)識(shí)語(yǔ)言有所不同,XML對(duì)大小寫(xiě)是敏感的。所以,<hamburger>元素和<Hamburger>元素在XML中是不同的。同時(shí),XML不會(huì)忽略空格(其他的語(yǔ)言常常忽略空格)。對(duì)每一個(gè)可能對(duì)文檔結(jié)構(gòu)造成混淆的字符,XML都會(huì)仔細(xì)的處理(就像< and >)。

  如果一個(gè)XML文檔只含有一個(gè)根元素,并且所有的子元素都被正確地放在父元素中,這樣的XML具有良好的風(fēng)格。更具體地說(shuō),就是對(duì)每一個(gè)給定的子元素,它的begin和end tag都只存在于相同的父元素中。下面就是一段風(fēng)格良好的XML文檔示例(hamburger.xml)。

<?xml version="1.0"?>
<hamburgers>
。糷amburger lowfat="dream on">
 。糿ame>CowBurger</name>
 。糳escription>Greasy and good.</description>
 。紁rice>2.99</price>
。/hamburger>
</hamburgers>


  誰(shuí)來(lái)定義Tags?

  讀了前面的部分后,你會(huì)發(fā)現(xiàn)你已基本上了解了XML的語(yǔ)法。其實(shí)這里的內(nèi)容并不是很多,XML確實(shí)是非常簡(jiǎn)單。

  可能你已經(jīng)注意到了,XML看起來(lái)很像HTML(Hypertext Markup Language)。他們都用相同的語(yǔ)法來(lái)定義begin和end tag以及一些屬性。從本質(zhì)上說(shuō),HTML使用的是一些預(yù)先設(shè)定好的元素和方法,只是XML的一個(gè)特例。這些元素及其相關(guān)的方法決定了瀏覽器如何解釋一個(gè)XML文檔,進(jìn)而提供給最終用戶(hù)。

  和HTML為創(chuàng)建用戶(hù)界面提供了一種通用的方法一樣,XML提供了一種描述并協(xié)同數(shù)據(jù)工作的通用方法。XML允許開(kāi)發(fā)者創(chuàng)建自己的XML詞匯,用自定義的方式描述他們自己的數(shù)據(jù)結(jié)構(gòu)。假如一個(gè)開(kāi)發(fā)者正在為一個(gè)快餐連鎖店開(kāi)發(fā)軟件,那么,為了描述一些食品,一個(gè)"漢堡包"元素可能會(huì)十分的方便。

  一旦開(kāi)發(fā)者使用了XML來(lái)描述他們的數(shù)據(jù),他們就可以很方便的在相同的或是不同的系統(tǒng)中對(duì)這些數(shù)據(jù)進(jìn)行互操作。當(dāng)然,前提是那些系統(tǒng)都能理解XML。譬如說(shuō),一位開(kāi)發(fā)者可以使用來(lái)自另一個(gè)系統(tǒng)的數(shù)據(jù),只要那些數(shù)據(jù)是用XML描述的。如此一來(lái),開(kāi)發(fā)者在考慮軟件的互操作性時(shí)就再也不必?fù)?dān)心諸如平臺(tái)、操作系統(tǒng)、語(yǔ)言、或是數(shù)據(jù)存儲(chǔ)等各方面的不同了。XML是實(shí)現(xiàn)系統(tǒng)之間互操作性的最簡(jiǎn)單工具。


[page_break]XML的名字空間

  由于XML對(duì)互操作性的支持,每個(gè)人都可以創(chuàng)建屬于自己的XML詞匯。這樣一來(lái),如果不同的開(kāi)發(fā)者用相同的元素來(lái)代表不同的實(shí)體的話(huà),后果是不可想象的。為了防止這種潛在的沖突,W3C在XML中引入了名字空間。

  XML名字空間為你的XML文檔元素提供了一個(gè)上下文。它允許開(kāi)發(fā)者按一定的語(yǔ)義來(lái)處理元素。還以漢堡包舉例說(shuō)明,在某個(gè)系統(tǒng)中price元素可能代表的是消費(fèi)者的購(gòu)買(mǎi)價(jià),而在另一個(gè)系統(tǒng)中,它可能代表了商店的進(jìn)貨價(jià)。下面的例子演示了名字空間是怎樣幫我們解決這樣的問(wèn)題的。

<?xml version="1.0"?>
<hamburgers
  xmlns:purchase="http://fastfood.org/franchise/prices"
  xmlns:sales="http://fastfood.org/customer/prices"

 <hamburger lowfat="dream on">
 。糿ame>CowBurger</name>
  <description>Greasy and good.</description>
 。紁urchase:price>0.99</price>
  <sales:price>2.99</price>
。/hamburger>
</hamburgers>

 

  我怎樣使用XML呢?

  XML的語(yǔ)法并不難,但想要用好XML,讓它幫我們做一些事還是有一定的挑戰(zhàn)性的。

  要用好XML,我們要能編程處理XML文件。W3C定義了一種軟件模型叫"XML處理器"。它能夠讀XML文檔并提供對(duì)其內(nèi)容和結(jié)構(gòu)的訪(fǎng)問(wèn)。微軟最主要的XML處理器叫做Microsoft XML(MSXML) 2.0。MSXML 2.0 捆綁于IE 5.0中,并且可以作為一個(gè)單獨(dú)的可分發(fā)文件從微軟MSDN XML的網(wǎng)站免費(fèi)獲得(http://msdn.microsoft.com/xml)。

  使用XML來(lái)作為描述數(shù)據(jù)的通用標(biāo)準(zhǔn)的一個(gè)主要優(yōu)點(diǎn)在于,任何XML處理器所提供的功能都能讓我們實(shí)現(xiàn)我們想到的目標(biāo)。開(kāi)發(fā)者幾乎不用(如果你曾這么干過(guò))費(fèi)力去寫(xiě)自己的XML處理器。理論上說(shuō),開(kāi)發(fā)者應(yīng)該使用市場(chǎng)上最好的處理器以避免出現(xiàn)兼容的問(wèn)題。

  使用一個(gè)標(biāo)準(zhǔn)的XML處理器,你可以通過(guò)編程讀各種XML文檔(例如hamburger.xml),訪(fǎng)問(wèn)任何元素、元素內(nèi)容或是元素屬性。如果你在一個(gè)基于Windows的系統(tǒng)中創(chuàng)建XML文檔,你也可以很方便的將這個(gè)文檔轉(zhuǎn)到大型機(jī)系統(tǒng)中,用大型機(jī)的XML處理器來(lái)實(shí)現(xiàn)與同樣數(shù)據(jù)的交互。這才是XML的真正魅力所在。作為一項(xiàng)技術(shù),XML并不能解決你的軟件的所有問(wèn)題;但它已成為一種在你和他人的應(yīng)用之間交換結(jié)構(gòu)化數(shù)據(jù)的開(kāi)放式有效機(jī)制。

  XML的核心技術(shù)

  直到現(xiàn)在,你已經(jīng)完全可以創(chuàng)建使用屬于你自己的XML文檔了。然而,XML真正的潛力卻在于它所支持的多項(xiàng)技術(shù)。你完全不必為此去使用本文以下所討論的所有技術(shù)。但它們的出現(xiàn)可以幫助你理解這些技術(shù)是怎樣作為整個(gè)XML策略的一部分被組合在一起的。

  確認(rèn)技術(shù)

  你已經(jīng)知道了XML為描述結(jié)構(gòu)良好的文檔提供了一整套靈活的語(yǔ)法。正因?yàn)樗倪@種靈活性,我們需要一些方法來(lái)確認(rèn)某一種特殊類(lèi)別的XML文檔都有我們所預(yù)計(jì)一種格式。例如,以下就是一個(gè)結(jié)構(gòu)良好的XML文檔:

<?xml version="1.0"?>
<hamburgers>
 <hamburger lowfat="dream on">
 。糷amburger lowfat="maybe">
  。糿ame>CowBurger</name>
  。糳escription>Greasy and good.</description>
  。紁rice>2.99</price>
   <price>3.99</price>
 。/hamburger>
。/hamburger>
</hamburgers>


  然而,這個(gè)文檔有一些應(yīng)用級(jí)的問(wèn)題。注意到了嗎,文檔中一個(gè)hamburger元素出現(xiàn)在了另一個(gè)hamburger元素的里面。請(qǐng)別擔(dān)心,對(duì)于這個(gè)例子來(lái)說(shuō)這個(gè)XML結(jié)構(gòu)沒(méi)有任何的錯(cuò)誤。另外,請(qǐng)注意在里層的hamburger元素中有多個(gè)price元素。哪一個(gè)price是正確的呢?系統(tǒng)有可能會(huì)顯示出這里有一個(gè)Bug。在這種情況下,一個(gè)標(biāo)準(zhǔn)的確認(rèn)XML文檔的機(jī)制將是十分有用的。


[page_break]schema

  一個(gè)schema通常是一組為了描述一類(lèi)給定的XML文檔而預(yù)先定好的規(guī)則。它定義了可以在指定XML文檔中出現(xiàn)的各個(gè)元素以及和某個(gè)元素相關(guān)的若干屬性。它同時(shí)定義了關(guān)于XML文檔的結(jié)構(gòu)化信息,比如哪幾個(gè)元素是其他元素的子元素,子元素出現(xiàn)的順序和他們的數(shù)量。它還可以定義一個(gè)元素是否為空,能否包含文本或者屬性是否有默認(rèn)值。

  DTDs(Document Type Definitions)和XML數(shù)據(jù) 都是怎樣描述XML文檔計(jì)劃的具體例子。

  文檔類(lèi)型定義(Document Type Definitions)

  DTD語(yǔ)言是為了定義SGML文檔的確認(rèn)規(guī)則而專(zhuān)門(mén)開(kāi)發(fā)的。因?yàn)閄ML是SGML的一個(gè)子集,所以DTDs也可以用來(lái)定義XML的確定規(guī)則。與XMLschema不同,一個(gè)XML處理器可以在運(yùn)行時(shí)用DTD來(lái)確定一個(gè)XML的合法性。

  DTD的語(yǔ)法有時(shí)可能會(huì)有一些晦澀難懂。DTDs使用不同的語(yǔ)法元素,諸如驚嘆號(hào)、圓括號(hào)、星號(hào)、尖括號(hào)等,來(lái)定義在一個(gè)XML文檔中那些元素是必備的,哪些是可選的以及可以出現(xiàn)的元素?cái)?shù)量等等。DTDs同時(shí)還定義了元素之間的關(guān)系和屬性于不同元素之間的關(guān)系。

  下面就是前面列出的hamburger.xml的DTD(hamburger.dtd):

<!ELEMENT hamburgers (hamburger)*>
<!ELEMENT hamburger(name, description, price)>
<!ATTLIST hamburger lowfat CDATA #IMPLIED>
<!ELEMENT name(#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT price(#PCDATA)>


  這篇文檔指出,hamburgers元素可以包含多個(gè)hamburger元素。同時(shí),每一個(gè)hamburger元素必須包含一個(gè)lowfat屬性和三個(gè)子元素,所有的類(lèi)型都是#PCData(parsed character data)。遵從這篇DTD的文檔都必須加入下面一行代碼:

  <!DOCTYPE hamburgers SYSTEM "hamburger.dtd">

  這句聲明告訴分析器不論DTD中的schema是什么都認(rèn)為XML文檔的內(nèi)容是合法的

  盡管MSXML 2.0支持DTDs,但是你還是會(huì)發(fā)現(xiàn)使用它們是很費(fèi)力的。它非常復(fù)雜并且難于掌握與使用。請(qǐng)注意,DTD語(yǔ)法并不是合法的XML。正因?yàn)槿绱,XML的處理器除了XML語(yǔ)法,還要支持用來(lái)描述schema的DTD語(yǔ)法。設(shè)想一下,假如我們用XML來(lái)描述schema,那么開(kāi)發(fā)者,特別是XML工具的提供者,所承擔(dān)的XML文檔檢驗(yàn)工作將會(huì)變得容易得多。W3C正在考慮幾種彌補(bǔ)DTDs不足的方案以提高現(xiàn)在的語(yǔ)法定義過(guò)程。

  XML數(shù)據(jù)

  XML-Data是一種XMLschema語(yǔ)言。在微軟的定義中,XML-Dataschema通常是指XMLschema,而不是DTDschema。一個(gè)XML-Dataschema是一個(gè)具有良好結(jié)構(gòu)的XML文檔。XML-Data語(yǔ)言基于XML-Data DTD,后者指明所期望的schema定義格式。因?yàn)閄ML-Dataschema是簡(jiǎn)單的XML文檔,任何用于XML文檔的工具都可以用來(lái)定義XML-Dataschema。

  以下的XML-Dataschema產(chǎn)生的schema和先前由hamburger.dtd所定義的schema是一樣的:

<?xml version="1.0"?>
<Schema xmlns="schemas-microsoft-com:xml-data">
。糆lementType name="name" />
。糆lementType name="description" />
 <ElementType name="price" />
 。糀ttributeType name="lowfat" />
  。糆lementType name="hamburger" />
   <element type="name" maxOccurs="1" />
  。糴lement type="description" maxOccurs="1" />
  。糴lement type="price" maxOccurs="1" />
   <attribute type="lowfat" maxOccurs="1" />
 。/ElementType>
。糆lementType name="hamburgers" model="closed">
 。糴lement type="hamburger" maxOccurs="*" />
 </ElementType>
</Schema>


  在XML-Dataschema中定義元素和屬性時(shí),分別用到的是<ElementType>和<AttributeType>元素。它們提供了對(duì)元素和屬性類(lèi)型的定義。定義一個(gè)元素或是屬性時(shí)用<element>或<attribute>標(biāo)簽。你可以通過(guò)定義minOccurs/maxOccurs來(lái)指定元素允許出現(xiàn)的數(shù)量。schemaXML結(jié)構(gòu)還定義了元素在XML文檔中允許出現(xiàn)的位置(例如一個(gè)<hamburgers>元素可以包含若干<hamburger>元素,等等)。

  微軟通過(guò)MSXML 2.0對(duì)XML-Data提供支持。根據(jù)微軟的XML SDK文檔,捆綁在IE 5中的XMLschema的實(shí)現(xiàn)基本上依托于W3C于1998年1月發(fā)布的XML-Data Note。它提供了對(duì)XML-Data子集的支持,這雖然和XML的語(yǔ)法稍有不同,正好直接和DCD中闡明的功能相吻合。


[page_break]處理器(API)技術(shù)

  我們?cè)谇懊嬉呀?jīng)提過(guò)了,為了有效的使用XML,你必須通過(guò)編程來(lái)訪(fǎng)問(wèn)數(shù)據(jù)。我們將一個(gè)能訪(fǎng)問(wèn)XML文檔同時(shí)又能提供對(duì)其內(nèi)容和數(shù)據(jù)結(jié)構(gòu)進(jìn)行訪(fǎng)問(wèn)的軟件模塊稱(chēng)為一個(gè)XML處理器或是一個(gè)XML API。

  雖然開(kāi)發(fā)者完全有自由去開(kāi)發(fā)或使用他們自己的XML API,但從他們的利益出發(fā),我還是建議他們使用行業(yè)標(biāo)準(zhǔn)的API。因?yàn)橹挥薪邮芰诵袠I(yè)標(biāo)準(zhǔn)的API,開(kāi)發(fā)者寫(xiě)出的代碼可以無(wú)需修改便能在其他的環(huán)境中順利執(zhí)行。

  目前有兩種主要的API已經(jīng)得到了廣大開(kāi)發(fā)者的廣泛使用,即將成為未來(lái)的行業(yè)標(biāo)準(zhǔn)。它們分別是:DOM(Document Object Model)和SAX(Simple API for XML)。

  DOM 文檔對(duì)象模型

  文檔對(duì)象模型是一種通過(guò)編程方式對(duì)XML文檔中數(shù)據(jù)及結(jié)構(gòu)進(jìn)行訪(fǎng)問(wèn)的標(biāo)準(zhǔn)。W3C已經(jīng)同意將其列為未來(lái)行業(yè)標(biāo)準(zhǔn)第一等級(jí)規(guī)范的推薦對(duì)象。

  DOM是基于XML文檔在內(nèi)存中的樹(shù)狀結(jié)構(gòu)。當(dāng)一個(gè)XML文件被裝入到處理器中時(shí),內(nèi)存中建立起一棵相應(yīng)的樹(shù)(見(jiàn)圖1)。DOM還定義了用來(lái)遍歷一棵XML樹(shù)和管理各個(gè)元素、值和屬性的編程接口(包括方法和屬性的名字)。



Figure 1. XML in-memory representation

  MSXML 2.0完全支持DOM并提供了一個(gè)易用的對(duì)象模型與內(nèi)存中樹(shù)進(jìn)行交互。下面是一個(gè)簡(jiǎn)單的VB例子,它演示了如何用MSXML來(lái)遍歷一顆樹(shù)的所有子元素。

Set xmlDoc = CreateObject("MSXML.DOMDocument")
bSuccess = xmlDoc.load("hamburger.xml")
If bSuccess Then
 For Each node in xmlDoc.documentElement.childNodes
  val = node.text
 Next
End If


  SAX

  DOM標(biāo)準(zhǔn)的一個(gè)主要不足在于將整個(gè)XML文檔裝入內(nèi)存所引起的巨大開(kāi)銷(xiāo)。當(dāng)文件的數(shù)據(jù)量非常大時(shí),這會(huì)給我們帶來(lái)一些問(wèn)題。當(dāng)你在內(nèi)部網(wǎng)或是因特網(wǎng)上傳輸如此巨大的XML文件時(shí),你可能等不及所有的文件傳輸結(jié)束就開(kāi)始處理數(shù)據(jù)。很多XML的開(kāi)發(fā)者已經(jīng)意識(shí)到這一點(diǎn),于是他們一起努力(從XML-DEV郵件列表開(kāi)始)開(kāi)始創(chuàng)立另一種新的標(biāo)準(zhǔn)。這就是SAX。雖然SAX還處于發(fā)展的初期,但因?yàn)樗錾男阅,它正快速的得到大家的歡迎。

  SAX是一種非常簡(jiǎn)單的XML API(正如它的名字那樣,Simple API for XML),它允許開(kāi)發(fā)者使用事件驅(qū)動(dòng)的XML解析。與DOM不同,SAX并不要求將整個(gè)XML文件一起裝入內(nèi)存。它的想法十分的簡(jiǎn)單,一旦XML處理器完成對(duì)XML元素的操作,它就立刻調(diào)用一個(gè)你自定義一個(gè)事件處理器及時(shí)的處理這個(gè)元素和相關(guān)數(shù)據(jù)。這樣做雖然能極大的提高效率,但也會(huì)造成一定的問(wèn)題。比如說(shuō),開(kāi)發(fā)者將不得不在靈活性上受到限制。


[page_break]轉(zhuǎn)換技術(shù)

  一旦你開(kāi)始使用標(biāo)準(zhǔn)的DOM API來(lái)實(shí)現(xiàn)于XML數(shù)據(jù)的交互,你便會(huì)發(fā)現(xiàn),無(wú)論是從一個(gè)大型的文檔中取得一個(gè)特定的數(shù)據(jù),還是將一個(gè)XML文檔的某一部分轉(zhuǎn)換為另一種格式的數(shù)據(jù)(例如HTML),都是十分單調(diào)乏味的。

  舉個(gè)例子說(shuō),假如你想找到所有的lowfat hamburger price元素。為了用標(biāo)準(zhǔn)的DOM API來(lái)完成這一切,你必須通過(guò)手工地書(shū)寫(xiě)代碼遍歷整顆樹(shù)來(lái)找尋符合條件的元素(在本例中,條件是指在hanburger元素中l(wèi)owfat=yes的price元素)。再看另一個(gè)例子,假設(shè)你想將所用的hamburger元素和相關(guān)的數(shù)據(jù)轉(zhuǎn)換為簡(jiǎn)單的HTML表格以供用戶(hù)交互使用。使用標(biāo)準(zhǔn)的DOM API,你得手工遍歷整棵樹(shù)來(lái)獲得HTML表格中所需的數(shù)據(jù)。

  我為了標(biāo)準(zhǔn)化及簡(jiǎn)化人們完成這些任務(wù)所需做的工作,W3C推薦使用XSL(Extensible Stylesheet Language)和一種叫做XSL Patterns的簡(jiǎn)單查詢(xún)語(yǔ)言。

  XSL Patterns

  一個(gè)模式就是一個(gè)字符串,通過(guò)它來(lái)選取XML樹(shù)中的節(jié)點(diǎn)。這樣的選取取決于模式所關(guān)連的當(dāng)前節(jié)點(diǎn)。元素的名字是最簡(jiǎn)單的模式,這個(gè)模式選取了當(dāng)前節(jié)點(diǎn)所有具有該名字的子節(jié)點(diǎn)。例如,hamburger模式選取了當(dāng)前節(jié)點(diǎn)的所有hamburger子節(jié)點(diǎn)。

  模式的語(yǔ)法非常完備。它允許你標(biāo)識(shí)某個(gè)指定元素在文檔中所處的上下文(例如,price元素在hamburger元素之中),同時(shí)它還提供了強(qiáng)大的篩選句法,使得我們可以標(biāo)識(shí)出符合給定條件的節(jié)點(diǎn)(例如,lowfat=yes)。為了找出一個(gè)hamburgers元素中的所有l(wèi)owfat hamburger price元素,你可以使用以下的模式字符串:

  

/hamburgers/hamburger[@lowfat="yes"]/price


  當(dāng)某個(gè)模式被應(yīng)用于給定的節(jié)點(diǎn)時(shí),它僅返回符合指定模式的節(jié)點(diǎn)列表。這大大簡(jiǎn)化了開(kāi)發(fā)者的操作,不再需要遍歷整棵樹(shù)。

  MSXML 2.0對(duì)模式語(yǔ)法的支持和Extensible Stylesheet Language (December 18th Working Draft)中2.6節(jié)的定義是相同的。MSXML 2.0中的IXMLDOMNode接口提供了兩個(gè)方法,SelectNodes和SelectSingleNode。這兩個(gè)方法都以一個(gè)模式串為參數(shù)。例如,下面的一行代碼將返回滿(mǎn)足條件的所有price節(jié)點(diǎn)。

  Set nodeList = rootNode.selectNodes("hamburger[@lowfat="yes"]/price")

  XSL

  XSL模式可以幫助我們標(biāo)識(shí)一篇給定XML文檔中的某些節(jié)點(diǎn),但對(duì)這些節(jié)點(diǎn)的操作最終還是有賴(lài)于開(kāi)發(fā)者來(lái)完成。XSL可以幫助我們簡(jiǎn)化完成通常XML任務(wù)的過(guò)程:將XML節(jié)點(diǎn)從一種格式轉(zhuǎn)化到另一種格式。這種對(duì)格式轉(zhuǎn)化的需求起源于Web開(kāi)發(fā)者需要將他們的XML數(shù)據(jù)轉(zhuǎn)化為HTML數(shù)據(jù)以供用戶(hù)瀏覽。

  實(shí)際上,XSL所能做得遠(yuǎn)比以上描述多得多。XSL能夠有效的定義從一種XML格式到另一種XML格式之間的轉(zhuǎn)換,這極大的增強(qiáng)了互操作性。假如某個(gè)人向你的系統(tǒng)發(fā)送了一篇XML文檔,而你的系統(tǒng)不認(rèn)識(shí)它所采用的XML詞匯,你只要進(jìn)行一次簡(jiǎn)單的XSL轉(zhuǎn)換就可以得到自己熟悉的詞匯。正是由于XML這種簡(jiǎn)單的特點(diǎn),開(kāi)發(fā)者才不用為了描述某種類(lèi)型的數(shù)據(jù)而采用通用的詞匯。

  一個(gè)XSL文件中包含了一系列定義轉(zhuǎn)換規(guī)則的聲明模板。每一個(gè)模板都明確定義了怎樣將源文檔中的指定節(jié)點(diǎn)轉(zhuǎn)換為輸出文檔中的節(jié)點(diǎn)(或其它類(lèi)型的數(shù)據(jù))的方法。你可以使用XSL模式來(lái)決定一個(gè)模板應(yīng)用于一篇文檔中的那些部分。

  作為一個(gè)示例,下面轉(zhuǎn)換hamburger XML文件:

<?xml version="1.0"?>
<hamburgers>
。糷amburger lowfat="dream on">
  <name>CowBurger</name>
 。糳escription>Greasy and good.</description>
  <price>2.99</price>
。/hamburger>
</hamburgers>


  轉(zhuǎn)換到HTML文件:

<html>
<body>
。糷1>hamburgers</h1>
。紀(jì)l>
 。糽i>CowBurger, $2.99, Greasy and good.</li>
 </ol>
</body>
</html>


  你使用的XSL文件如下:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/TR/WD-xsl ">
<xsl:template match="/">
<html>
<body>
。糷1>hamburgers</h1>
。紉sl:for-each select="hamburgers[@lowfat="dream on"]>
 。糽i><xsl:value-of select="name"/>, <xsl:value-of select="price"/>,
 。紉sl:value-of select="description"/></li>
。/xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>


  注意到了嗎,我們是怎樣在不同XSL元素的match和select屬性中使用XSL模式來(lái)標(biāo)識(shí)元素集的?在<xsl:template>標(biāo)簽中定義了一組節(jié)點(diǎn)的轉(zhuǎn)換規(guī)則。XSL使用了一套標(biāo)準(zhǔn)的XML詞匯來(lái)定義轉(zhuǎn)換的過(guò)程,是不是很有趣呢?


[page_break]鏈接技術(shù)

  很多人都認(rèn)為,HTML真正強(qiáng)勁的地方在于它的錨元素。

 。糀 >some link</A>

  錨元素使開(kāi)發(fā)者可以建立從一個(gè)HTML頁(yè)面到另一個(gè)頁(yè)面的鏈接,定義兩個(gè)文檔之間的關(guān)系。這給用戶(hù)提供了一種從當(dāng)前頁(yè)面中獲取更多相關(guān)數(shù)據(jù)的途徑。同時(shí),這也是用戶(hù)在查詢(xún)數(shù)據(jù)中所使用的典型方法。為了查找數(shù)據(jù),他們?yōu)g覽某一頁(yè)面,同時(shí)他們?cè)谶@篇該頁(yè)面中可能會(huì)發(fā)現(xiàn)更符合他們要求的內(nèi)容。而這些內(nèi)容通過(guò)一個(gè)鏈接,存放在不同的頁(yè)面上。

  整個(gè)Web就是基于這樣一個(gè)在不同的數(shù)據(jù)文件之間建立關(guān)系(鏈接)的基石上的。隨著IT行業(yè)不斷的向前發(fā)展,我們自然會(huì)想到用類(lèi)似的機(jī)制來(lái)描述不同XML文檔或是相同文檔中不同元素之間的聯(lián)系。

  XLink

  XML Linking 1.0 (XLink)是W3C主導(dǎo)的定義XML鏈接的語(yǔ)法。根據(jù)XLink 1.0文檔的要求,一個(gè)XML鏈接,或XLink的描述信息,顯式的指定了資源或部分資源之間的關(guān)系。在XLink中,我們并不涉及標(biāo)示不同類(lèi)型數(shù)據(jù)位置的方法(例如URIs、XPointers和圖形坐標(biāo))。

  這里是一個(gè)XML連接的簡(jiǎn)單例子:

<hamburger xml:link="simple" HREF =
  "http://fastfood.org/hamburger.asp">
</hamburger>

  XPointer

  在前面的章節(jié)中你已經(jīng)讀到,XLink需要依靠不同的機(jī)制來(lái)標(biāo)識(shí)你想要鏈接的資源(例如統(tǒng)一資源標(biāo)識(shí)符)。W3C推出了另一種叫做XPointer的機(jī)制用于構(gòu)造XML文檔的內(nèi)部結(jié)構(gòu)。具體地說(shuō),它決定了一篇XML文檔中的元素、字符串或其它部分是否具有某個(gè)具體的標(biāo)識(shí)。

  一個(gè)XPointer包括一系列描述位置的術(shù)語(yǔ),它們中的任何一個(gè)都指定了一個(gè)特定的位置信息,通常這樣的位置信息總是和前一個(gè)術(shù)語(yǔ)所指定的位置信息相關(guān)聯(lián)。每一個(gè)位置術(shù)語(yǔ)都有一個(gè)關(guān)鍵字(例如id,child,ancestor等等)和若干變量,諸如實(shí)例的序列號(hào)、元素類(lèi)型或?qū)傩?聪旅娴睦樱?br>
  child(2,hamburger)

  指的是第二個(gè)類(lèi)型為hamburger的元素。

  其他XML相關(guān)的技術(shù)和詞匯

  目前為止我們所談到的已經(jīng)代表了XML的核心技術(shù)?赡苣阌X(jué)得這些東西已經(jīng)足夠了,但如果我們不深入下去對(duì)眼下一些正流行起來(lái)的XML相關(guān)技術(shù)和詞匯作一些介紹的話(huà),這篇文章探討XML的文章就顯得不是很完整了。目前,這些新技術(shù)正在W3C的開(kāi)發(fā)小組的努力下一步步走向成熟。

  MathML(Mathematical Markup Language)

  MathML是一種用來(lái)描述數(shù)學(xué)符號(hào)、紀(jì)錄其結(jié)構(gòu)和內(nèi)容的XML應(yīng)用。MathML的目標(biāo)是在Web上實(shí)現(xiàn)能像HTML處理文本一樣,處理數(shù)學(xué)問(wèn)題。下面是由W3C提供的的MathML例子。數(shù)學(xué)方程:

   x2 + 4x + 4 =0

  在MathML中可以用以下的XML詞匯表示:

<apply>
。紁lus/>
。糰pply>
  <power/>
 。糲i>x</ci>
 。糲n>2</cn>
 </apply>
。糰pply>
 。紅imes/>
 。糲n>4</cn>
  <ci>x</ci>
。/apply>
 <cn>4</cn>
</apply>

  SMIL

  SMIL(Synchronized Multimedia Integration Language,它的發(fā)音和"smile"一樣)是一種基于XML的表述多媒體演示的語(yǔ)言。SMIL允許將一組獨(dú)立的多媒體對(duì)象整合為一個(gè)多媒體演示。作為另一種行業(yè)趨勢(shì),HTML+TIME依靠SMIL功能在你的HTML頁(yè)面中加入多媒體"時(shí)間"特性,F(xiàn)在IE 5提供了一個(gè)HTML+TIME的實(shí)現(xiàn)。下面例子中的頁(yè)面中包含了一個(gè)時(shí)間序列。位于時(shí)間段中的每一個(gè)P元素會(huì)等到前一個(gè)P元素消失后再出現(xiàn)。

<HTML>
<HEAD>
。糞TYLE>
  .time { behavior:url(#default#time); }
。/STYLE>
</HEAD>
<BODY>
。糄IV CLASS="time" t:timeline="seq">
。糚 class="time" t:dur="1">
  This appears for one second and goes away
 </P>
。糚 class="time" t:dur="1">
  This appears after one second, remains visible for one second
  and goes away
 </P>
。糚 class="time" t:dur="1">
  This appears after two seconds, remains visible for one second
  and goes away
。/P>
。/DIV>
</BODY>
</HTML>

  VML(Vector Markup Language)

  矢量標(biāo)記語(yǔ)言用于定義矢量信息編碼格式的一個(gè)XML應(yīng)用,它和其他的標(biāo)記一起決定了信息以何種形式顯示在屏幕上。VML對(duì)標(biāo)記矢量圖形信息的支持和HTML對(duì)標(biāo)記文本信息的支持是一樣的。一些微軟的產(chǎn)品(例如Microsoft Powerpoint? 2000)支持項(xiàng)文件導(dǎo)出到HTML,使用VML來(lái)描述圖形信息。下面一段簡(jiǎn)單的VML示例定義了一個(gè)形狀:

<v:shape style='top: 0; left: 0; width: 250; height: 250'
stroke="true" strokecolor="red" strokeweight="2" fill="true"
fillcolor="green" coordorigin="0 0" coordsize="175 175">
<v:path v="m 8,65
l 72,65,92,11,112,65,174,65,122,100,142,155,92,121,42,155,60,100
x e"/>
</v:shape>


  CDF(Channel Definition Format)

  CDF是一種開(kāi)放的規(guī)格,它允許Web的發(fā)布者經(jīng)常的更新信息或是頻道。而這些信息能從Web服務(wù)器自動(dòng)的傳送到PC上的兼容接受程序或是其他的信息裝置上。用戶(hù)僅需選擇一下頻道,信息就會(huì)定時(shí)的傳遞到客戶(hù)端。當(dāng)信息下載到客戶(hù)端后,CDF起到了頻道內(nèi)容目錄的作用。

  XML片斷

  XML的規(guī)格支持由若干實(shí)體組成的邏輯文檔。通常,查看、編輯一個(gè)或多個(gè)實(shí)體甚至于實(shí)體的某個(gè)部分比查看、編輯整篇文檔來(lái)得更普遍、更有意義。于是,我們就需要一種方法使得客戶(hù)端可以不用涉及整篇文檔,就能在一篇較大的文檔中獲得文檔片斷所處的上下文信息。XML片斷為實(shí)現(xiàn)這樣的目標(biāo)創(chuàng)立了一種機(jī)制。

  XHTML

  XHTML是符合XML的新HTML文檔中的又一個(gè)家族。XHTML文檔被設(shè)計(jì)成可以和XML處理器協(xié)同工作。不過(guò),現(xiàn)在你的瀏覽器能看到的絕大多數(shù)HTML文件都不是編撰結(jié)構(gòu)良好的XML文檔。例如,一個(gè)<LI>開(kāi)始標(biāo)識(shí)符常常沒(méi)有相應(yīng)的</LI>結(jié)束標(biāo)識(shí)符。因此,即使可能,使用標(biāo)準(zhǔn)XML工具同HTML進(jìn)行交互也會(huì)變得非常困難。

  XHTML文檔是結(jié)構(gòu)良好的XML,因此使用標(biāo)準(zhǔn)XML處理器對(duì)它們進(jìn)行查看、編輯或驗(yàn)證都十分容易。同時(shí),輕量級(jí)客戶(hù)(如Palm-PC)處理錯(cuò)誤的工作將變得更為簡(jiǎn)單。

  XHTML的規(guī)格十分明確,遵從XHTML 1.0標(biāo)準(zhǔn)的XHTML文檔在XHTML環(huán)境下具有更好的客戶(hù)操作性。XHTML將成為Internet發(fā)展的下一個(gè)目標(biāo)。借助于XHTML,網(wǎng)站內(nèi)容的開(kāi)發(fā)者可以進(jìn)入XML的世界,享用各種各樣的便利而再不用為他們產(chǎn)品的兼容性而煩惱了。

  總結(jié)

  除了上面我們列出的技術(shù),XML相關(guān)的技術(shù)還有很多。我們將把對(duì)這些技術(shù)的探索留給你自己去完成。相信你已經(jīng)感到,在XML及其相關(guān)技術(shù)發(fā)展的背后,有著巨大的、整個(gè)行業(yè)范圍內(nèi)的努力在支持者它。

  XML必將改變我們未來(lái)開(kāi)發(fā)互操作性軟件的世界。如果想進(jìn)一步了解XML對(duì)軟件組件技術(shù)的影響,請(qǐng)看Lessons From the Component Wars: An XML Manifesto(http://msdn.microsoft.com/library/en-us/dnxml/html/xmlmanifesto.asp)

  想要深入學(xué)習(xí)有關(guān)XML的大量信息是比較困難的,人們往往很難看清所有這些東西是怎樣融合為一個(gè)整體的。這篇文章向你介紹了XML和它相關(guān)的一些技術(shù)。到目前為止,你已經(jīng)大致明白了XML技術(shù)是什么以及這些核心技術(shù)是怎樣整合在一起的。也就是說(shuō),你已經(jīng)為今后進(jìn)一步學(xué)習(xí)XML做好了準(zhǔn)備!