




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
XML語言介紹(I)簡介XML,或稱為可擴(kuò)展標(biāo)記語言(ExtensibleMarkupLanguage),是一種您可以用來創(chuàng)建自己的標(biāo)記的標(biāo)記語言。它由萬維網(wǎng)協(xié)會(W3C)創(chuàng)建,用來克服HTML(即超文本標(biāo)記語言(HypertextMarkupLanguage),它是所有網(wǎng)頁的基礎(chǔ))的局限。和HTML一樣,XML基于SGML—
標(biāo)準(zhǔn)通用標(biāo)記語言(StandardGeneralizedMarkupLanguage)。盡管SGML已在出版業(yè)使用了數(shù)十年,但其理解方面的復(fù)雜性使許多本打算使用它的人望而卻步(SGML也代表“聽起來很棒,但或許以后會用(Soundsgreat,maybelater)”)。XML是為Web設(shè)計(jì)的。我們?yōu)槭裁葱枰猉MLHTML始終是最成功的標(biāo)記語言。您幾乎可以在任何設(shè)備(從掌上電腦到大型機(jī))上查看最簡單的HTML標(biāo)記,并且您甚至可以用合適的工具將HTML標(biāo)記轉(zhuǎn)換成語音和其它格式。既然HTML成功了,為什么W3C還要創(chuàng)建XML呢?為了回答這個(gè)問題,請查看下面這個(gè)文檔:<p><b>Mrs.MaryMcGoon</b><br>1401MainStreet<br>Anytown,NC34829</p>HTML的問題在于它是為人設(shè)計(jì)的。即使不用瀏覽器查看上面的HTML文檔,您和我也會知道那是某個(gè)人的郵政地址。(具體而言,它是美國某個(gè)人的郵政地址;即使您一點(diǎn)也不熟悉美國郵政地址的格式,您可能也會猜出這表示什么。)作為人,您和我具有理解大多數(shù)文檔的含義和意圖的智慧。遺憾的是機(jī)器不能做到。盡管這個(gè)文檔中的標(biāo)記告訴瀏覽器如何顯示該信息,但標(biāo)記沒有告訴瀏覽器信息是什么。您和我知道它是一個(gè)地址,但機(jī)器不知道。顯示HTML要顯示HTML,瀏覽器只需遵循HTML文檔中的指令即可。段標(biāo)記告訴瀏覽器在新的一行顯示,并且通常在前面有一個(gè)空行,而兩個(gè)換行標(biāo)記則告訴瀏覽器前進(jìn)到下一行,并且行之間沒有空行。盡管瀏覽器出色地將文檔格式化,但機(jī)器仍不知道這是地址。樣本XML文檔現(xiàn)在讓我們來看一個(gè)樣本XML文檔。使用XML,您可以給文檔中的標(biāo)記賦予某種含意。更重要的是,機(jī)器也容易處理這樣的信息。您只需通過找到<postal-code>
和</postal-code>
標(biāo)記之間的內(nèi)容(技術(shù)上稱為<postal-code>
元素),就可以從該文檔抽取郵政編碼。簡單例子<address><name><title>Mrs.</title><first-name>Mary</first-name><last-name>McGoon</last-name></name><street>1401MainStreet</street><citystate="NC">Anytown</city><postal-code>34829</postal-code></address>標(biāo)記、元素和屬性標(biāo)記是左尖括號(<)和右尖括號(>)之間的文本。有開始標(biāo)記(例如<name>)和結(jié)束標(biāo)記(例如</name>)元素是開始標(biāo)記、結(jié)束標(biāo)記以及位于二者之間的所有內(nèi)容。在上面的樣本中,<name>
元素包含三個(gè)子元素:<title>、<first-name>
和<last-name>。屬性是一個(gè)元素的開始標(biāo)記中的名稱-值對。在該示例中,state
是<city>
元素的屬性。XML正如何改變著Web既然您已經(jīng)看到開發(fā)人員可以使用XML創(chuàng)建具有自我描述性數(shù)據(jù)的文檔,讓我們看看人們正如何利用這些文檔來改進(jìn)Web。以下是幾個(gè)關(guān)鍵領(lǐng)域:XML簡化了數(shù)據(jù)交換。因?yàn)椴煌M織(乃至同一組織的不同部門)很少就單一工具集形成標(biāo)準(zhǔn),所以要使應(yīng)用程序相互交流需要進(jìn)行大量工作。使用XML,每個(gè)組織可以創(chuàng)建單一的實(shí)用程序,該實(shí)用程序?qū)⒃摻M織的內(nèi)部數(shù)據(jù)格式轉(zhuǎn)換成XML,反之亦然。最好有這樣的機(jī)會:這些組織的軟件供應(yīng)商已經(jīng)提供了在它們的數(shù)據(jù)庫記錄(或LDAP目錄,或采購訂單等等)與XML之間進(jìn)行相互轉(zhuǎn)換的工具。XML支持智能代碼。因?yàn)榭梢允筙ML文檔結(jié)構(gòu)化以標(biāo)識每個(gè)非常重要的信息片段(以及這些片段之間的關(guān)系),所以可以編寫無需人工干預(yù)就能處理這些XML文檔的代碼。軟件供應(yīng)商花費(fèi)了大量時(shí)間和金錢來構(gòu)建XML開發(fā)工具這一事實(shí)意味著編寫那樣的代碼是相對簡單的過程。XML支持智能搜索。盡管搜索引擎這些年在穩(wěn)步改進(jìn),但從搜索中得到錯誤的結(jié)果仍很常見。如果您正在搜索包含名叫“Chip”的人的HTML頁面,您可能還會找到有關(guān)功克力片、計(jì)算機(jī)芯片、木片以及許多其它無用匹配的頁面。搜索XML文檔查找包含文本Chip
的<first-name>
元素會給您一個(gè)好得多的結(jié)果集。(II)XML文檔規(guī)則如果您研究過HTML文檔,您會熟悉使用標(biāo)記來標(biāo)注文檔文本的基本概念。本章討論HTML文檔和XML文檔之間的區(qū)別。它介紹了XML文檔的基本規(guī)則,并討論了用于描述它們的術(shù)語。關(guān)于XML文檔,有一點(diǎn)很重要:XML規(guī)范需要解析器拒絕任何沒有遵守基本規(guī)則的XML文檔。大多數(shù)HTML解析器接受隨意的標(biāo)記,它們會猜測文檔作者的意圖。為了避免一般的HTML文檔中松散結(jié)構(gòu)所造成的混亂,XML的創(chuàng)造者們決定從一開始就強(qiáng)制文檔結(jié)構(gòu)。(如果您不熟悉解析器,那么順便說明一下:解析器是嘗試讀取文檔并解釋其內(nèi)容的一段代碼。)無效、有效以及格式良好的文檔有三種XML文檔:無效文檔沒有遵守XML規(guī)范定義的語法規(guī)則。如果開發(fā)人員已經(jīng)在DTD或模式中定義了文檔能夠包含什么,而某個(gè)文檔沒有遵守那些規(guī)則,那么這個(gè)文檔也是無效的。有效文檔既遵守XML語法規(guī)則也遵守在其DTD或模式中定義的規(guī)則。格式良好的文檔遵守XML語法,但沒有DTD或模式。
需要注意的幾點(diǎn)元素是區(qū)分大小寫的元素不能重疊必須有根元素必須有結(jié)束標(biāo)記屬性取值要加引號根元素XML文檔必須包含在一個(gè)單一元素中。這個(gè)單一元素稱為根元素,它包含文檔中所有文本和所有其它元素。在下面的示例中,XML文檔包含在一個(gè)單一元素<greeting>
中。請注意文檔有一行注釋在根元素之外;那是完全合乎規(guī)則的。<?xmlversion="1.0"?><!--Awell-formeddocument--><greeting>Hello,World!</greeting>而不包含單一根元素的文檔不管該文檔可能包含什么信息,XML解析器都會拒絕它。
結(jié)束標(biāo)記是必需的不能省去任何結(jié)束標(biāo)記。如果一個(gè)元素根本不包含標(biāo)記,則稱為空元素;HTML換行(<br>)和圖像(<img>)元素就是兩個(gè)例子。在XML文檔的空元素中,您可以把結(jié)束斜杠放在開始標(biāo)記中。下面的兩個(gè)換行元素和兩個(gè)圖像元素對于XML解析器來說是一回事:<imgsrc="../img/c.gif"></img><imgsrc="../img/c.gif"/>
屬性必須有用引號括起的值XML文檔中的屬性有兩個(gè)規(guī)則:屬性必須有值那些值必須用引號括起。您可以使用單引號,也可以使用雙引號,但要始終保持一致。XML聲明大多數(shù)XML文檔以XML聲明作為開始,它向解析器提供了關(guān)于文檔的基本信息。<?xmlversion="1.0"encoding="ISO-8859-1"standalone="no"?>XML文檔中的其它項(xiàng)注釋<!--……-->處理指令<?......?>實(shí)體:<!ENTITYdw"developerWorks">
無論XML處理器在何處找到字符串&dw;,它都會用字符串developerWorks
代替該實(shí)體。名稱空間<customer_summaryxmlns:addr="/addresses/"xmlns:books="/books/"xmlns:mortgage="/title/">...<addr:name><title>Mrs.</title>...</addr:name>......<books:title>LordoftheRings</books:title>......<mortgage:title>NC2948-388-1983</mortgage:title>...名稱空間定義中的字符串僅僅是字符串。對,這些字符串看似URL,其實(shí)不是。您可以定義xmlns:addr="mike",那也是有效的。名稱空間唯一的重要性在于其唯一性;這就是為什么大多數(shù)名稱空間定義看起來象URL的原因。XML解析器不會到/books/
去搜索DTD或模式,它只是把那個(gè)文本作為字符串使用。這有些令人困惑,但名稱空間就是這樣工作的。(III)定義文檔內(nèi)容定義用來表示數(shù)據(jù)的元素有兩種方法。一種方法是使用文檔類型定義(DocumentTypeDefinition),或簡稱DTD。DTD定義可以在XML文檔中出現(xiàn)的元素、這些元素出現(xiàn)的次序、它們可以如何相互嵌套以及XML文檔結(jié)構(gòu)的其它詳細(xì)信息。DTD是最初的XML規(guī)范的一部分,與SGMLDTD非常相似。另一種方法是使用XMLSchema。模式可以定義您能在DTD中使用的所有文檔結(jié)構(gòu),它還可以定義數(shù)據(jù)類型和比DTD更復(fù)雜的規(guī)則。W3C在提出最初的XML規(guī)范的幾年之后開發(fā)了XMLSchema規(guī)范。文檔類型定義DTD允許您指定XML文檔的基本結(jié)構(gòu)。<!--address.dtd--><!ELEMENTaddress(name,street,city,state,postal-code)><!ELEMENTname(title?first-name,last-name)><!ELEMENTtitle(#PCDATA)><!ELEMENTfirst-name(#PCDATA)><!ELEMENTlast-name(#PCDATA)><!ELEMENTstreet(#PCDATA)><!ELEMENTcity(#PCDATA)><!ELEMENTstate(#PCDATA)><!ELEMENTpostal-code(#PCDATA)>該DTD定義了樣本文檔中使用的所有元素。它定義了三個(gè)元素:<address>
元素包含一個(gè)<name>、一個(gè)<street>、一個(gè)<city>、一個(gè)<state>
和一個(gè)<postal-code>。所有這些元素必須出現(xiàn),而且必須以這個(gè)順序出現(xiàn)。<name>
元素包含一個(gè)可選的<title>
元素(問號表示title這個(gè)元素是可選的),后面跟有一個(gè)<first-name>
和一個(gè)<last-name>
元素。所有其它包含文本的元素。(#PCDATA
代表已解析字符數(shù)據(jù);不能在這些元素中包含另一個(gè)元素。)盡管DTD相當(dāng)簡單,但它清楚地說明了什么樣的元素組合是合乎規(guī)則的。<postal-code>
元素在<state>
元素之前的地址文檔是不合乎規(guī)則的,沒有<last-name>
元素的文檔也不合乎規(guī)則。另外,請注意,DTD語法不同于普通的XML語法。(相反,XMLSchema文檔本身就是XML,這導(dǎo)致一些有趣的結(jié)果)。盡管DTD的語法不同,但您仍可以將普通的注釋放到DTD中。DTD中的符號<!ELEMENTname(title?,first-name,(middle-initial|middle-name)?,last-name)>
逗號表示項(xiàng)的列表。問號表示這一項(xiàng)是可選的;它可以出現(xiàn)一次或根本不出現(xiàn)。加號表示這一項(xiàng)必須至少出現(xiàn)一次,但可出現(xiàn)任意次。星號表示這一項(xiàng)可以出現(xiàn)任意次,包括零次。豎線符號表示選擇列表;您只能從列表選擇一項(xiàng)。靈活性說明如要定義一個(gè)XML文檔的結(jié)構(gòu),您應(yīng)該象在應(yīng)用程序中設(shè)計(jì)數(shù)據(jù)庫模式或數(shù)據(jù)結(jié)構(gòu)那樣事先考慮DTD或模式。您事先考慮的未來需求越多,以后實(shí)現(xiàn)它們就越容易而且成本越低。定義屬性可以定義將在XML文檔中出現(xiàn)的元素的屬性。使用DTD,您還可以:定義哪些屬性是必需的定義屬性的缺省值列出給定屬性的所有有效值
<!ELEMENTcity(#PCDATA)><!ATTLISTcitystateCDATA(AZ|CA|NV|OR|UT|WA)"CA"postal-codeCDATA#REQUIRED>
XML模式使用XML模式,您會有更多的能力來定義什么樣的XML文檔是有效的。它們與DTD相比有幾個(gè)優(yōu)勢:XML模式使用XML語法。換句話說,XML模式是一個(gè)XML文檔。這意味著您可以象處理任何其它文檔一樣處理模式。例如,您可以編寫一個(gè)XSLT樣式表,該樣式表將XML模式轉(zhuǎn)換成具有自動生成的JavaScript代碼的Web表單,其中的JavaScript代碼可以驗(yàn)證您輸入的數(shù)據(jù)。XML模式支持?jǐn)?shù)據(jù)類型。盡管DTD確實(shí)支持?jǐn)?shù)據(jù)類型,但很明顯這些數(shù)據(jù)類型是從發(fā)布的角度開發(fā)的。XML模式支持DTD中的所有原始數(shù)據(jù)類型(諸如標(biāo)識和標(biāo)識引用之類的類型)。它們還支持整數(shù)、浮點(diǎn)數(shù)、日期、時(shí)間、字符串、URL和其它對數(shù)據(jù)處理和驗(yàn)證有用的數(shù)據(jù)類型。XML模式是可擴(kuò)展的。除了XML模式規(guī)范中定義的數(shù)據(jù)類型以外,您還可以創(chuàng)建自己的數(shù)據(jù)類型,并且可以基于其它數(shù)據(jù)類型派生出新的數(shù)據(jù)類型。XML模式有更強(qiáng)的表達(dá)能力。例如,您可以用XML模式定義任何<state>
屬性值不得超過2個(gè)字符,或定義任何<postal-code>
元素的值必須與正則表達(dá)式[0-9]{5}(-[0-9]{4})?
相匹配。您無法用DTD做這些事。定義模式中的元素<xsd:element>
元素定義了一些XML元素。頭兩個(gè)定義的元素(<address>
和<name>)由其它元素組成。<xsd:sequence>
元素定義了包含在這兩個(gè)元素中的元素的序列。與DTD版本一樣,XML模式示例定義<address>
包含一個(gè)<name>、一個(gè)<street>、一個(gè)<city>、一個(gè)<state>
和一個(gè)<postal-code>
元素,并且依照上面的次序。請注意,該模式實(shí)際上用<xsd:complexType>
元素定義了新的數(shù)據(jù)類型。大多數(shù)元素包含文本;定義它們很簡單。您只要聲明新的元素,然后指定它的數(shù)據(jù)類型為xsd:string:<xsd:elementname="title"type="xsd:string"/><xsd:elementname="first-Name"type="xsd:string"/><xsd:elementname="last-Name"type="xsd:string"/><xsd:elementname="street"type="xsd:string"/><xsd:elementname="city"type="xsd:string"/>
定義模式中的元素內(nèi)容樣本模式為兩個(gè)元素的內(nèi)容定義了約束:<state>
元素的內(nèi)容必須是兩個(gè)字符長,而<postal-code>
元素的內(nèi)容必須與正則表達(dá)式[0-9]{5}(-[0-9]{4})?
匹配。對于<state>
和<postal-code>
元素,模式用約束定義了新的數(shù)據(jù)類型。第一個(gè)情況使用<xsd:length>
元素,而第二個(gè)情況則使用<xsd:pattern>
元素定義該元素必須匹配的正則表達(dá)式。(IX)API(應(yīng)用程序接口)XML有多種編程接口。這些接口為開發(fā)人員使用XML文檔提供了一致的接口。有許多API可以使用:文檔對象模型(DocumentObjectModel(DOM))用于XML的簡單API(SimpleAPIforXML(SAX))用于XML解析的JavaAPI(JavaAPIforXMLParsing(JAXP)……文檔對象模型DOM文檔對象模型(通常稱為DOM)為XML文檔的已解析版本定義了一組接口。解析器讀入整個(gè)文檔,然后構(gòu)建一個(gè)駐留內(nèi)存的樹結(jié)構(gòu),然后您的代碼就可以使用DOM接口來操作這個(gè)樹結(jié)構(gòu)。您可以遍歷樹以了解原始文檔包含了什么,您可以刪除樹的幾個(gè)部分,還可以重新排列樹和添加新的分支,等等。DOM和基于樹的處理使用DOM時(shí),數(shù)據(jù)以類樹結(jié)構(gòu)被裝入內(nèi)存中。同一文檔將被表示為節(jié)點(diǎn),如左邊所示。矩形框表示元素節(jié)點(diǎn),橢圓形表示文本節(jié)點(diǎn)。DOM使用根節(jié)點(diǎn)和父子關(guān)系。例如,在本例中,samples將是帶有五個(gè)子節(jié)點(diǎn)的根節(jié)點(diǎn):三個(gè)文本節(jié)點(diǎn)(空白)和兩個(gè)元素節(jié)點(diǎn)server和monitor。實(shí)際上,server和monitor有null值。相反,它們有子文本節(jié)點(diǎn)UNIX和color。DOM問題DOM構(gòu)建整個(gè)文檔駐留內(nèi)存的樹。如果文檔很大,就會要求有極大的內(nèi)存。DOM創(chuàng)建表示原始文檔中每個(gè)東西的對象,包括元素、文本、屬性和空格。如果您只需關(guān)注原始文檔的一小部分,那么創(chuàng)建那些永遠(yuǎn)不被使用的對象是極其浪費(fèi)的。DOM解析器必須在您的代碼取得控制權(quán)之前讀取整個(gè)文檔。對于非常大的文檔,這會引起顯著的延遲。這些僅僅是由文檔對象模型的設(shè)計(jì)引起的問題;撇開這些問題,DOMAPI是解析XML文檔非常有用的方法。用于XML的簡單APISAX解析器向您的代碼發(fā)送事件。當(dāng)解析器發(fā)現(xiàn)元素開始、元素結(jié)束、文本、文檔的開始或結(jié)束等時(shí),它會告訴您。您可以決定什么事件對您重要,而且可以決定要創(chuàng)建什么類型的數(shù)據(jù)結(jié)構(gòu)以保存來自這些事件的數(shù)據(jù)。如果您沒有顯式地保存來自某個(gè)事件的數(shù)據(jù),它就被丟棄。SAX解析器根本不創(chuàng)建任何對象,它只是將事件傳遞給您的應(yīng)用程序。如果希望基于那些事件創(chuàng)建對象,這將由您來完成。SAX解析器在解析開始的時(shí)候就開始發(fā)送事件。當(dāng)解析器發(fā)現(xiàn)文檔開始、元素開始和文本等時(shí),代碼會收到一個(gè)事件。您的應(yīng)用程序可以立即開始生成結(jié)果;您不必一直等到整個(gè)文檔被解析完畢。更妙的是,如果您只查找文檔中某些內(nèi)容,代碼一旦找到所要找的東西就可以拋出一個(gè)異常。該異常會停止SAX解析器,然后代碼用它找到的數(shù)據(jù)做它需要做的任何事。SAX處理是如何工作的
SAX分析經(jīng)過其的XML流,考慮以下XML代碼片斷:<?xmlversion="1.0"?><samples><server>UNIX</server><monitor>color</monitor></samples>SAX處理涉及以下幾步:創(chuàng)建事件處理程序。創(chuàng)建SAX解析器。將事件處理程序分配給解析器。對文檔進(jìn)行解析,將每個(gè)事件發(fā)送給處理程序。SAX問題這種處理的好處非常象流介質(zhì)的好處;可以立即開始分析,而不是必須等待所有要處理的數(shù)據(jù)。同樣,由于應(yīng)用程序簡單地檢查經(jīng)過其的數(shù)據(jù),所以不需要將數(shù)據(jù)存儲在內(nèi)存里。當(dāng)遇到大文檔時(shí),這是一個(gè)突出的優(yōu)勢。一般來講,SAX還比其替代物“文檔對象模型”快。另一方面,由于應(yīng)用程序不以任何方式存儲數(shù)據(jù),所以,使用SAX時(shí),不可能對數(shù)據(jù)進(jìn)行更改,或者“返回”至數(shù)據(jù)流中前面的數(shù)據(jù)。在SAX與DOM之間如何選擇選擇DOM還是SAX,這取決于幾個(gè)因素:應(yīng)用程序的目的:如果必須對數(shù)據(jù)進(jìn)行更改,并且作為XML將它輸出,則在大多數(shù)情況下,使用DOM
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年常見會計(jì)面試試題及答案
- 2025年c 開發(fā)筆試題及答案
- “去有風(fēng)的地方”春日風(fēng)箏主題暖場露營文旅方案
- 2025年日本gd面試試題及答案
- 2025年寫字風(fēng)格測試題及答案
- 2025年中招速寫考試試題及答案
- 2025年濟(jì)寧二模物理試題及答案
- 2025年pest商務(wù)理論與實(shí)務(wù)試題及答案
- 2025年招聘公告筆試題庫及答案
- 2025年醫(yī)師編制面試試題及答案
- 兩、三位數(shù)乘一位數(shù)(連續(xù)進(jìn)位)(教案)-三年級上冊數(shù)學(xué)人教版
- 五年級數(shù)學(xué)(小數(shù)乘法)計(jì)算題及答案匯編
- 新質(zhì)生產(chǎn)力課件
- T-NAHIEM 101-2023 急診科建設(shè)與設(shè)備配置標(biāo)準(zhǔn)
- 【綠色家園你我共建】約會春天擁抱綠色-2024年3月12日植樹節(jié)主題班會(小學(xué)通用版)
- 解分式方程50題八年級數(shù)學(xué)上冊
- 手術(shù)患者vte預(yù)防
- 消化道出血應(yīng)急預(yù)案
- 2023年城市體檢基礎(chǔ)指標(biāo)體系
- 2024年《滕王閣序》原文及翻譯
- AI技術(shù)在保險(xiǎn)行業(yè)的應(yīng)用
評論
0/150
提交評論