XML將被用來描述、存儲(chǔ)數(shù)據(jù),而HTML則是用來格式化和顯示數(shù)據(jù)的。 XML DTD/Schema <->; 數(shù)據(jù)庫表結(jié)構(gòu) XML 文件 <->; 數(shù)據(jù)庫表內(nèi)容 XML的文檔格式 首先介紹XML文檔內(nèi)容的基本單元——元素,它的語法格式如下: 〈標(biāo)簽〉文本內(nèi)容〈/標(biāo)簽〉 元素是由起始標(biāo)簽、元素內(nèi)容和結(jié)束標(biāo)簽組成。用戶把要描述的數(shù)據(jù)對(duì)象放在起始標(biāo)簽和結(jié)束標(biāo)簽之間。例如: <姓名>;王平</姓名>; 無論文本內(nèi)容有多長(zhǎng)或者多么復(fù)雜,XML元素中還可以再嵌套別的元素,這樣使相關(guān)信息構(gòu)成等級(jí)結(jié)構(gòu)。下面的例子中,在<employees>;的元素中包括了所有職員的信息,每位職員都由<employee>;元素來描述,而<employee>;元素中又嵌套了<name>;和<salary>;元素。 例1: <employees>; <employee>; <name>;Lars Peterson</name>; <salary>;25000</salary>; </employee>; <employee>; <name>;Charlotte M. Cooper</name>; <salary>;34500</salary>; </employee>; </employees>; 除了元素,XML文檔中能出現(xiàn)的有效對(duì)象是:處理指令、注釋、根元素、子元素和屬性。 ● 處理指令 處理指令給XML解析器提供信息,使其能夠正確解釋文檔內(nèi)容,它的起始標(biāo)識(shí)是“<?”,結(jié)束標(biāo)識(shí)是“?>;”。常見的XML聲明就是一個(gè)處理指令: <?xml version=“1.0”?>; 處理指令還可以有其他的用途,比如定義文檔的編碼方式是GB碼還是Unicode編碼方式,或是把一個(gè)樣式單文件應(yīng)用到XML文檔上用以顯示。 ● 注釋 注釋是XML文件中用作解釋的字符數(shù)據(jù),XML處理器不對(duì)它們進(jìn)行任何處理。注釋是用“<!--”和“ -->; ”引起來的,可以出現(xiàn)在XML元素間的任何地方,但是不可以嵌套: <!--這是一個(gè)注釋-->; ● 根元素和子元素 如果一個(gè)元素從文件頭的序言部分之后開始一直到文件尾,包含了文件中所有的數(shù)據(jù)信息,我們稱之為根元素。 XML元素是可以嵌套的,那么被嵌套在內(nèi)的元素稱為子元素。在前面的例子中?lt;employee>;就是<employees>;的子元素。 ● 屬性 屬性給元素提供進(jìn)一步的說明信息,它必須出現(xiàn)在起始標(biāo)簽中。屬性以名稱/取值對(duì)出現(xiàn),屬性名不能重復(fù),名稱與取值之間用等號(hào)“=”分隔,并用引號(hào)把取值引起來。例如: <salary currency=“US$”>; 25000 </salary>; 上例中的屬性說明了薪水的貨幣單位是美元。 XML的語法 XML文檔的基本結(jié)構(gòu)由序言部分和一個(gè)根元素組成。序言包括了XML聲明和DTD(或者是XML Schema),DTD(Document Type Define,文檔定義類型)和XML Schema都是用來描述XML文檔結(jié)構(gòu)的,也就是描述元素和屬性是如何聯(lián)系在一起的。 例如,在例1的文檔前面加上如下的序言部分,就構(gòu)成了一個(gè)完整的XML文檔: <?xml version=“1.0”?>; <!DOCTYPE employees SYSTEM“employees.dtd”>; 一個(gè)XML文檔中有且僅有一個(gè)根元素,其他所有的元素都是它的子元素,在例1中,<employees>;就是根元素。 一個(gè)XML文檔首先應(yīng)當(dāng)是“格式良好的”(Well-Formed),該規(guī)定的正式定義位于: http://www./TR/REC-xml “格式良好的”XML文檔除了要滿足根元素唯一的特性之外,還包括: ● 起始標(biāo)簽和結(jié)束標(biāo)簽應(yīng)當(dāng)匹配:結(jié)束標(biāo)簽是必不可少的; ● 大小寫應(yīng)一致:XML對(duì)字母的大小寫是敏感的,<employee>;和<Employee>;是完全不同的兩個(gè)標(biāo)簽,所以結(jié)束標(biāo)簽在匹配時(shí)一定要注意大小寫一致; ● 元素應(yīng)當(dāng)正確嵌套:子元素應(yīng)當(dāng)完全包括在父輩元素中,下面的例子就是嵌套錯(cuò)誤: <A>; <B>; </A>; </B>; 正確的嵌套方式如下: <A>; <B>; </B>; </A>; ● 屬性必須包括在引號(hào)中; 單引號(hào)雙引號(hào)都可以,一般是雙引號(hào)。 <gangster name=‘George "Shotgun" Ziegler‘> ● 元素中的屬性是不允許重復(fù)的。 數(shù)據(jù)既可以存儲(chǔ)在子元素中也可以存儲(chǔ)在屬性中, 我的經(jīng)驗(yàn)是屬性在HTML中可能相當(dāng)便利,但在XML中,你最好避免使用,把數(shù)據(jù)存儲(chǔ)到子元素中。有些時(shí)候應(yīng)該為一個(gè)元素設(shè)計(jì)一個(gè)ID引用,通過這個(gè)ID可以引用存取特定的XML元素,就象HTML中的name和id屬性一樣?! ?br>XML文檔的“有效性”是指一個(gè)XML文檔應(yīng)當(dāng)遵守DTD文件或是Schema的規(guī)定,“有效的”XML文檔肯定是“格式良好的”,有關(guān)內(nèi)容我們會(huì)在以后詳細(xì)說明。 XML Schema(XML模式)是基于XML的DTD的替代品,DTD和Schema可以相互替代。 ●XML的名稱空間 XML文檔中很可能會(huì)定義許多名字相同而意義不同的元素或?qū)傩?,尤其在把不同的XML文檔合而為一時(shí),更容易產(chǎn)生沖突。名稱空間就是為了解決這個(gè)問題而提出的。它用URI(Uniform Resource Indicator,統(tǒng)一資源指示器)加以區(qū)別,是在XML文件的元素和屬性中出現(xiàn)的所有名稱的集合。如下例: <pr:payment xmlns:pr=“http://www. microsoft.com/payroll”>; <pr:employee>;Lars Peterson</pr:employee>; <pr:description>;Reimburse expenses</pr:description>; <pr:total>;199.76</pr:total>; </pr:payment>; 有了名稱空間,用戶就可以保證在文件中使用的名稱是唯一的。對(duì)元素的屬性xmlns進(jìn)行定義就表示對(duì)該元素指定了一個(gè)名稱空間。namespace_name必須是一個(gè)有效的URI。 如果省略local_prefix(本地前綴),這時(shí)就構(gòu)成了缺省名稱空間: <payment xmlns=“http://www.microsoft.com/acct”>; <customer>;1234</customer>; <amount>;500.00</amount>; <date_received>;12-03-2000</date_received>; </payment>; 如果對(duì)一個(gè)元素定義了缺省名稱空間,那么該元素及其子元素,包括它們的屬性都會(huì)自動(dòng)地成為該名稱空間的一部分,不用再在每一個(gè)元素和屬性前面一一標(biāo)明了。 ●使用XML,空白將被保留 在XML文檔中,空白部分不會(huì)被解析器自動(dòng)刪除。 這一點(diǎn)與HTML是不同的。在HTML中,這樣的一句話: "Hello my name is Ordm"將會(huì)被顯示成:“Hello my name is Ordm”, 因?yàn)镠TML解析器會(huì)自動(dòng)把句子中的空白部分去掉。 ●XML元素命名 XML元素命名必須遵守下面的規(guī)則: 元素的名字可以包含子母,數(shù)字和其他字符。 元素的名字不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開頭。 元素的名字不能以XML(或者xml,Xml,xMl...)開頭。 元素的名字不能包含空格。 自己“發(fā)明”的XML元素還必須注意下面一些簡(jiǎn)單的規(guī)則: 任何的名字都可以使用,沒有保留字(除了XML),但是應(yīng)該使元素的名字具有可讀性,名字使用下劃線是一個(gè)不錯(cuò)的選擇。 例如: <first_name>, <last_name>. 盡量避免使用“-”,“.”,因?yàn)橛锌赡芤鸹靵y。 只要你愿意元素的名字可以很長(zhǎng),但也不要太夸張了哦。命名應(yīng)該遵循簡(jiǎn)單易讀的原則,例如:<book_title>是一個(gè)不錯(cuò)的名字,而<the_title_of_the_book>則顯得羅嗦了。 XML文檔往往都對(duì)應(yīng)著數(shù)據(jù)表,我們應(yīng)該盡量讓數(shù)據(jù)庫中的字段的命名和相應(yīng)的XML文檔中的命名保持一致,這樣可以方便數(shù)據(jù)變換。 非英文/字符/字符串也可以作為XML元素的名字,例如<藍(lán)色理想><經(jīng)典論壇>這都是完全合法的名字。但是有一些軟件不能很好的支持這種命名,所以盡量使用英文字母來命名。 在XML元素命名中不要使用":",因?yàn)閄ML命名空間需要用到這個(gè)十分特殊的字符。
在本文開始部分,我們對(duì)XML這個(gè)新興的技術(shù)做了一個(gè)概述,對(duì)它的優(yōu)缺點(diǎn)進(jìn)行了分析,并對(duì)其美好的應(yīng)用前景進(jìn)行了展望。在本文后半部分則對(duì)XML文檔的相關(guān)語法、格式做了簡(jiǎn)要的描述,并介紹了幾種有用的開發(fā)工具。在以后的內(nèi)容中,我們會(huì)全面展開,深入到XML技術(shù)內(nèi)部,去探索一下這個(gè)美妙的世界!
一、顯示XML XML文檔本身只描述數(shù)據(jù)內(nèi)容,它的顯示功能由樣式單來完成。利用樣式單技術(shù)時(shí),輸出平臺(tái)不局限于顯示器,可以是打印機(jī)、繪圖儀或者是多媒體播放器。使用獨(dú)立的樣式單文件制定顯示格式的一大優(yōu)勢(shì)在于:對(duì)同一份數(shù)據(jù)文件可以制定不同的樣式風(fēng)格,應(yīng)用在不同的場(chǎng)合,使數(shù)據(jù)能夠更合理、更有針對(duì)性地表現(xiàn)出來,提高了數(shù)據(jù)的重用性。 目前,W3C正式推薦的樣式單標(biāo)準(zhǔn)有兩種: 一種是層疊樣式單CSS(Cascading Style Sheets);另一種是可擴(kuò)展樣式單語言XSL。 CSS最初是用于制定HTML文檔顯示格式的,現(xiàn)在也可用來對(duì)XML文檔進(jìn)行簡(jiǎn)單的樣式規(guī)劃。CSS在HTML中的應(yīng)用極為廣泛,但它在文本置換、依據(jù)文本內(nèi)容而決定顯示方式、對(duì)數(shù)據(jù)進(jìn)行排序等智能化的顯示功能上略顯不足。 <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/css" href="cd_catalog.css"?> 而XSL則較好地解決了CSS的這些問題,它最常用的功能是將XML的置標(biāo)轉(zhuǎn)換成為HTML的置標(biāo)并顯示輸出。而且XSL還可以將XML文檔向任何其他格式的結(jié)構(gòu)文檔進(jìn)行轉(zhuǎn)換。這種功能在B2B的商務(wù)模式中有著很好的應(yīng)用前景。 XSL利用模式匹配的方法,選擇XML文檔中需要處理的元素/屬性,再針對(duì)這些特定的對(duì)象制定相應(yīng)的轉(zhuǎn)換規(guī)則。借助XSL,我們還可以添加新的元素/屬性,對(duì)所有元素/屬性進(jìn)行重新排序、循環(huán)處理、條件判斷等程序化的控制,使其適應(yīng)各種復(fù)雜的需求。 在XML文檔中引用XSL的格式如下: <?xml-stylesheet type=“text/xsl” href=“Employees.xsl” ?>; 一個(gè)XML文檔只能引用一個(gè)XSL樣式單。XML解析器在處理XML文檔時(shí),遇到處理指令后,會(huì)載入指定的XSL樣式單,然后根據(jù)其中的規(guī)則進(jìn)行相應(yīng)的轉(zhuǎn)換處理。
二、綁定XML Web服務(wù)器與客戶機(jī)之間的數(shù)據(jù)傳遞方式有三種: HTML頁面、XML文檔以及XML數(shù)據(jù)島。其中,XML數(shù)據(jù)島通過特定的標(biāo)簽把XML數(shù)據(jù)直接嵌入到HTML文檔中。采用數(shù)據(jù)島作為交互手段,不僅可以使數(shù)據(jù)具備一定的語義信息,同時(shí)還能保持HTML原有的一些特色,如利用用戶端腳本程序?qū)崿F(xiàn)動(dòng)態(tài)信息交換等。 XML數(shù)據(jù)島的實(shí)現(xiàn)方法是在HTML文檔中使用<XML>;標(biāo)簽。代碼的嵌入方式有兩種: 直接嵌入(如例1)和外部引用(如例2)。 例1: <XML ID=“MyXMLData”>; <?xml version=“1.0” ?>; ……XML definitions…… </XML>; 例2: <XML ID=“MyXMLData” SRC=“http://www.microsoft.com/MyXMLData.xml”>; </XML>; 在插入數(shù)據(jù)島之后,就可以把XML中的元素同HTML元素鏈接在一起,利用HTML的表現(xiàn)手法顯示XML數(shù)據(jù),這種鏈接關(guān)系被稱為綁定。綁定的方式按照HTML元素的性質(zhì)可以分為兩種:?jiǎn)沃祵?duì)象和表格對(duì)象。 單值對(duì)象的數(shù)據(jù)綁定需要在HTML元素中設(shè)置DATASRC屬性和DATAFLD屬性。DATASRC屬性是區(qū)分XML數(shù)據(jù)島對(duì)象的唯一標(biāo)識(shí),并且必須加上前綴“#”;DATAFLD屬性則標(biāo)識(shí)了數(shù)據(jù)島中的元素對(duì)象。例3就是把一個(gè)HTML文本輸入框與<salary>;元素進(jìn)行了綁定。 例3: <INPUT TYPE=“TEXT” DATASRC=“#MyXMLData” DATAFLD=“salary”>; 至于表格對(duì)象,主要是與HTML中的<TABLE>;標(biāo)簽綁定。一般地,可以借助DSO(Data Source Object,數(shù)據(jù)源對(duì)象)等ActiveX控件更方便、有效地處理表格數(shù)據(jù)。具體使用方法在以后的內(nèi)容中將做詳細(xì)介紹。 XML數(shù)據(jù)島可以綁定到HTML元素上(比如表格)。 在下面的例子中,一個(gè)XML數(shù)據(jù)島(ID=cdcat)被從外部XML文檔載入。一個(gè)HTML的表格綁定到此數(shù)據(jù)島上。HTML表格內(nèi)部的span元素使用datafld屬性和XML文檔相應(yīng)的XML元素相互綁定。 <html> <body> <xml id="cdcat" src="cd_catalog.xml"></xml> <table border="1" datasrc="#cdcat"> <tr> <td><span datafld="ARTIST"></span></td> <td><span datafld="TITLE"></span></td> </tr> </table> </body> </html>
三、訪問XML Document Object Model(文檔對(duì)象模型)簡(jiǎn)稱為DOM,是對(duì)Web文檔進(jìn)行應(yīng)用開發(fā)、編程的應(yīng)用程序接口(API),是W3C公布的一種跨平臺(tái)的、與語言無關(guān)的接口規(guī)范。 DOM采用對(duì)象模型和一系列的接口來描述XML文檔的內(nèi)容和結(jié)構(gòu),即利用對(duì)象把文檔模型化。這種對(duì)象模型實(shí)現(xiàn)的基本功能包括: ● 描述文檔表示和操作的接口; ● 接口的行為和屬性; ● 接口之間的關(guān)系以及互操作。 DOM對(duì)結(jié)構(gòu)化的XML文檔進(jìn)行解析,文檔中的指令、元素、實(shí)體、屬性等所有個(gè)體都可以用對(duì)象模型表示。整個(gè)文檔的邏輯結(jié)構(gòu)類似一棵樹,生成的對(duì)象模型就是樹的節(jié)點(diǎn),每個(gè)對(duì)象同時(shí)包含了方法和屬性。 利用DOM,開發(fā)人員可以進(jìn)行動(dòng)態(tài)地創(chuàng)建XML文檔、遍歷結(jié)構(gòu)、添加/修改/刪除內(nèi)容等操作。DOM面向?qū)ο蟮奶匦?,使人們?cè)谔幚砗蚗ML解析相關(guān)的事務(wù)時(shí)節(jié)省大量精力,是一種符合代碼重用思想的強(qiáng)有力編程工具。
四、XML解析器 如果瀏覽器使用javascript作為腳本語言,那么利用下面的代碼可以創(chuàng)建XML文檔對(duì)象: var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") 如果瀏覽器使用VBScript作為腳本語言,那么利用下面的代碼可以創(chuàng)建XML文檔對(duì)象: set xmlDoc=CreateObject("Microsoft.XMLDOM") 如果在ASP程序中使用VBScript腳本語言,那么就可以使用下面的代碼形式: set xmlDoc=Server.CreateObject("Microsoft.XMLDOM") 將XML文檔載入解析器 使用腳本代碼可以將XML文檔載入解析器。 下面的代碼可以將一個(gè)XML文檔載入解析器: <script type="text/javascript"> var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("note.xml") // ....... processing the document goes here </script> 第二行代碼創(chuàng)建Microsoft XML解析器的實(shí)例。 第三行代碼關(guān)閉異步載入,確保XML解析器在把XML文檔完全載入以前不會(huì)對(duì)XML文檔進(jìn)行解析。 第四行則告訴解析器需要載入的XML文檔名字是note.xml。 把純XML文檔由字符載入解析器 解析器可以從一個(gè)文本字符串中載入XML文本。 下面的代碼演示了將文本字符串載入解析器: <script type="text/javascript"> var text="<note>" text=text+"<to>Tove</to><from>Jani</from>" text=text+"<heading>Reminder</heading>" text=text+"<body>Don‘t forget me this weekend!</body>" text=text+"</note>" var xmlDoc = new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.loadXML(text) // ....... processing the document goes here </script> 注意這里載入字符串使用的是"loadXML()"方法)(而不是前面用過的"load()"方法), "loadXML()"是用于載入字符串,"load()"是用于載入XML文檔。 使用javascript語言顯示XML數(shù)據(jù) 可以使用javascript語言來顯示XML數(shù)據(jù)。 javascript (或者 VBScript)可以從XML文檔中導(dǎo)入數(shù)據(jù),并將這些數(shù)據(jù)在HTML頁面中顯示出來。 <html> <head> <script type="text/javascript" for="window" event="onload"> var xmlDoc=new ActiveXObject("Microsoft.XMLDOM") xmlDoc.async="false" xmlDoc.load("xml_note.xml") nodes=xmlDoc.documentElement.childNodes to.innerText= nodes.item(0).text from.innerText= nodes.item(1).text header.innerText=nodes.item(2).text body.innerText= nodes.item(3).text </script> <title>HTML using XML data</title> </head> <body bgcolor="yellow"> <h1>W3Schools.com Internal Note</h1> <b>To: </b> <span id="to"> </span> <br /> <b>From: </b> <span id="from"></span> <hr> <b><span id="header"></span></b> <hr> <span id="body"></span> </body> </html>
|