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