Xml簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
XML(簡(jiǎn)介)
XML(可擴(kuò)展標(biāo)記語(yǔ)言)在 20 世紀(jì) 90 年代后期登上舞臺(tái)后,就一直是眾多活動(dòng)和狂熱思索的焦點(diǎn)。XML 只是基于普通文本,但卻提供了幾乎可以在任何兩個(gè)應(yīng)用程序間共享數(shù)據(jù)的方式。
雖然 XML 在概念上很簡(jiǎn)單,但對(duì) XML 的處理卻通常很煩瑣(需要編寫(xiě)大量重復(fù)性的代碼)和復(fù)雜(很多容易被忽視的細(xì)節(jié)導(dǎo)致錯(cuò)誤)。
什么時(shí)候使用 XML?
什么時(shí)候在Web 應(yīng)用程序中使用 XML?
- 你需要處理已經(jīng)保存在 XML 中的數(shù)據(jù)時(shí)。
- 你希望用 XML 保存數(shù)據(jù)并為將來(lái)可能的整合做準(zhǔn)備時(shí)。(XML 在應(yīng)用程序整合的場(chǎng)景中最有意義)
- 你希望使用依賴(lài)于 XML 的技術(shù)時(shí)。(Web 服務(wù)使用各種建立在 XML 上的標(biāo)準(zhǔn))
- 注解:
- 必須理解的一個(gè)重要概念是,存儲(chǔ)數(shù)據(jù)時(shí)必須決定兩件事情:
- 確定數(shù)據(jù)結(jié)構(gòu)化的方式(邏輯格式)
- 確定數(shù)據(jù)保存的方式(物理存儲(chǔ))
XML 是格式的選擇而不是存儲(chǔ)的選擇。也就是說(shuō),即使你決定用 XML 保存數(shù)據(jù),你還要決定是保存到數(shù)據(jù)庫(kù)字段里,還是要插入到一個(gè)文件里,或者只是以字符串或其他對(duì)象的形式保存在內(nèi)存中。
XML 簡(jiǎn)介
XML 規(guī)范是由 W3C(World Wide Web Consortium)定義的一組指南,用于以純文本的形式描述結(jié)構(gòu)化數(shù)據(jù),一種基于尖括號(hào)間標(biāo)簽的標(biāo)記語(yǔ)言。
XML 沒(méi)有一組固定的標(biāo)簽。相反,XML 是一種可用于創(chuàng)建其他標(biāo)記語(yǔ)言的元語(yǔ)言。
下面的文檔顯示一個(gè)保存產(chǎn)品類(lèi)別的自定義 XML 格式:
<?xml version="1.0" encoding="utf-8" ?> <productCatalog> <catalogName>Acme Fall 2015 Catalog</catalogName> <expiryDate>2015-01-01</expiryDate> <products> <product id="1001"> <productName>Magic Ring</productName> <productPrice>342.10</productPrice> <inStock>true</inStock> </product> <product id="1002"> <productName>Flying Carpet</productName> <productPrice>982.99</productPrice> <inStock>true</inStock> </product> </products> </productCatalog>
標(biāo)簽可以自由使用最能描述你的數(shù)據(jù)的任意名稱(chēng),正是這種靈活性使得 XML 非常成功。當(dāng)然,靈活性也會(huì)有缺點(diǎn)。不同公司完全可用不同的標(biāo)簽名來(lái)描述相似的數(shù)據(jù),盡管所有應(yīng)用程序都能夠解析 XML 數(shù)據(jù),但數(shù)據(jù)的寫(xiě)入者和讀取者需要對(duì)標(biāo)簽和結(jié)構(gòu)達(dá)成共識(shí),才能使讀取者可用解釋數(shù)據(jù)并抽取有意義的信息。
XML 的優(yōu)點(diǎn)
今天,XML 比過(guò)去任何一天都更為有用?,F(xiàn)代應(yīng)用程序使用 XML 的好處有以下幾點(diǎn):
- 適應(yīng)性。XML 無(wú)處不在,無(wú)論什么時(shí)候需要共享數(shù)據(jù),XML 都會(huì)成為首選目標(biāo)。
- 擴(kuò)展性和靈活性。XML 不會(huì)強(qiáng)加任何數(shù)據(jù)語(yǔ)義的規(guī)則,適用于任意數(shù)據(jù)的類(lèi)型并且實(shí)現(xiàn)的代價(jià)很低。
- 相關(guān)標(biāo)準(zhǔn)和工具。XML 成功的另一個(gè)原因在于創(chuàng)建和處理 XML 的工具(解析器)和相關(guān)標(biāo)準(zhǔn)(XML架構(gòu)、XPath、XSLT)。這樣幾乎每種語(yǔ)言的開(kāi)發(fā)者都有現(xiàn)成的組件用于閱讀 XML,按某種規(guī)則(被稱(chēng)作架構(gòu))驗(yàn)證 XML 的有效性,將 XML 轉(zhuǎn)換格式等。
格式良好的 XML
XML 是一個(gè)非常嚴(yán)格的標(biāo)準(zhǔn),這種嚴(yán)格性是用于保留廣泛的兼容性的。(臭名昭著的 HTML 語(yǔ)言就是在沒(méi)有這種嚴(yán)格性標(biāo)準(zhǔn)下的產(chǎn)物)
所有的 XML 解析器都會(huì)執(zhí)行一些基本的質(zhì)量檢查。如果一個(gè) XML 文檔不能滿足所有標(biāo)準(zhǔn),它就會(huì)被徹底拒絕。否則,它就被認(rèn)為是格式良好的。格式良好的 XML 未必就是正確的 XML ,例如含有錯(cuò)誤數(shù)據(jù),但 XML 解析器能夠解析它。
XML 文檔必須滿足下面這些條件才能被認(rèn)為是格式良好的:
- 每個(gè)開(kāi)始標(biāo)簽必須有一個(gè)對(duì)應(yīng)的結(jié)束標(biāo)簽
- 空元素必須以“/>”結(jié)束
- 元素可以嵌套但不能交錯(cuò)
- XML 是嚴(yán)格區(qū)分大小寫(xiě)的,因此 <FirstName> 和 </firstName > 不能配對(duì)
- 一個(gè)元素不能有兩個(gè)或更多的同名特性,但是可以嵌套多個(gè)同名的元素
- 一個(gè)文檔只可以有一個(gè)根元素
- 所有特性在值的前后都要有引號(hào)
- 注釋不能放入標(biāo)簽中(它們包含在 <!-- 和 --> 標(biāo)記中)
XML 命名空間
隨著 XML 標(biāo)準(zhǔn)的成長(zhǎng),已創(chuàng)建了數(shù)十種 XML 標(biāo)記語(yǔ)言(通常叫做 XML 語(yǔ)法)。其中很多屬于特定的行業(yè)、流程和信息類(lèi)型。如果你需要同時(shí)組合兩個(gè)具有相同名稱(chēng)元素的 XML 語(yǔ)法,會(huì)發(fā)生什么呢?另一個(gè)更典型的問(wèn)題是如何區(qū)分它們?
解決辦法在于 XML 命名空間標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)的核心思想是所有的 XML 標(biāo)記語(yǔ)言都擁有能夠唯一區(qū)分相關(guān)元素的命名空間。簡(jiǎn)單的說(shuō),命名空間可以在整合時(shí)消除同名元素的歧義。
所有的 XML 命名空間都使用 URI(Universal Resource Identifiers,統(tǒng)一資源標(biāo)識(shí)符),一般看起來(lái)和網(wǎng)頁(yè)的 URL 相似。例如,http://www.mycompany.com/mystandard 是一種典型的命名空間,但這不是必要的(也不應(yīng)該被假設(shè)),命名空間可以是任意文本序列,標(biāo)準(zhǔn)是為了確保它的唯一性。
要指定某個(gè)元素屬于特定的命名空間,只需在開(kāi)始標(biāo)簽中加入 xmlns(XML Name Space)特性表明要使用的命名空間即可。例如,下面這個(gè)元素是http://mycompany/OrderML 命名空間的一部分。
<order xmlns="http://mycompany/OrderML"></order> 你一定會(huì)厭倦在所有元素上加入這個(gè)特性的煩瑣操作,幸好,如果像下面這樣加入命名空間,它會(huì)成為所有子元素默認(rèn)的命名空間: <product xmlns="http://mycompany/OrderML"> <productName>Flying Carpet</productName> <productPrice>982.99</productPrice> <inStock>true</inStock> </product> 你還可以自定義命名空間前綴,在 xmlns 特性中插入一個(gè)冒號(hào)和一個(gè)你想用作前綴的字符: <ord:order xmlns:ord="http://mycompany/OrderML" xmlns:cli="http://mycompany/ClientML"> <cli:client> <cli:firstName>...</cli:firstName> <cli:lastName>...</cli:lastName> </cli:client> <ord:orderItem>...</ord:orderItem> <ord:orderItem>...</ord:orderItem> </ord:order>
XML 架構(gòu)
XML 的靈活性也帶來(lái)了一些問(wèn)題。世界各地的開(kāi)發(fā)人員都使用你的 XML 格式,怎樣才能保證所有人都遵守規(guī)則?
解決辦法是創(chuàng)建一個(gè)格式文檔,它定義你的自定義標(biāo)記語(yǔ)言的規(guī)則,它被稱(chēng)為架構(gòu)。這些規(guī)則不會(huì)包括語(yǔ)法細(xì)節(jié)(那是 XML 標(biāo)準(zhǔn)所要規(guī)定的),架構(gòu)文檔需要定義的是符合你的數(shù)據(jù)類(lèi)型的邏輯規(guī)則,它包括以下幾項(xiàng):
- 文檔詞匯。它定義了哪些元素或特性的名字可以出現(xiàn)在你的 XML 文檔中。
- 文檔結(jié)構(gòu)。它定義了標(biāo)簽放在哪兒,可以指定標(biāo)簽之間的順序,還可以指定某個(gè)元素可以出現(xiàn)的次數(shù)。
- 支持的數(shù)據(jù)類(lèi)型。可以定義數(shù)據(jù)是文本,或者必須是可以解析的數(shù)值數(shù)據(jù)、日期信息等。
- 允許的數(shù)據(jù)范圍??蓪?shù)值限制在范圍內(nèi),文本限定在特定長(zhǎng)度內(nèi),強(qiáng)迫正則表達(dá)式模式匹配,或者限制僅可以是某些特定的值。
下面的這個(gè) XML 架構(gòu)定義了前面所示的產(chǎn)品類(lèi)別規(guī)則:
<?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="productCatalog"> <xsd:complexType> <xsd:sequence> <xsd:element name="CatalogName" type="xsd:string" /> <xsd:element name="expiryDate" type="xsd:date" /> <xsd:element name="products"> <xsd:complexType> <xsd:sequence> <xsd:element name="product" type="productType" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="productType"> <xsd:sequence> <xsd:element name="productName" type="xsd:string" /> <xsd:element name="productPrice" type="xsd:decimal" /> <xsd:element name ="inStock" type="xsd:boolean" /> </xsd:sequence> <xsd:attribute name="id" type="xsd:integer" use="required" /> </xsd:complexType> </xsd:schema>
- 所有的架構(gòu)文檔都是以根元素 <schema> 開(kāi)頭的 XML 文檔
- 所有可用的元素都已經(jīng)在 XML 架構(gòu)空間定義了(http://www.w3.org/2001/XMLSchema)
- 你的架構(gòu)文檔必須使用正確的命名空間名(前綴一般是 xsd 或 xs ,你也可以自定義)
- 在 <schema> 元素內(nèi),有兩種類(lèi)型的定義
- <element> 定義目標(biāo)文檔必須遵循的結(jié)構(gòu)
- <complexType> 定義文檔結(jié)構(gòu)較小的數(shù)據(jù)結(jié)構(gòu)
- <element>標(biāo)簽是架構(gòu)的核心,同時(shí)它也是所有驗(yàn)證的起點(diǎn)
在這個(gè)示例中,<element>標(biāo)簽確定產(chǎn)品類(lèi)別必須以一個(gè)叫做<productCatalog>的根元素開(kāi)始。<productCatalog>元素內(nèi)部是一個(gè)由3個(gè)元素組成的序列。第一個(gè)是<catalogName>,它包含普通文本;第二個(gè)是<expiryDate>,它包含符合日期呈現(xiàn)規(guī)則的文本;第三個(gè)是<products>,它包含<product>元素的列表。
每個(gè)<product>元素都是一個(gè)復(fù)雜的類(lèi)型,因此文檔后面又使用<complexType>進(jìn)行了定義。這個(gè)復(fù)雜類(lèi)型(名為<productType>)由含有產(chǎn)品信息的 3 個(gè)元素所組成的序列構(gòu)成。這些元素分別保存文本(<productName>)、十進(jìn)制數(shù)(<productPrice>)、布爾值(<inStock>)。這個(gè)復(fù)雜類(lèi)型還包括一個(gè)必須的特性 id。
相關(guān)文章
氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-操作檢查列表
氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-操作檢查列表...2007-02-02氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-簡(jiǎn)介
氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-簡(jiǎn)介...2007-02-02javascript xml xsl取值及數(shù)據(jù)修改
前幾天公司要用xml快速方便的存取屬性N多的數(shù)據(jù),跟sinoly合作研究了一下.做了一個(gè)小例子.2008-06-06氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-內(nèi)容目錄
氣象 XML 數(shù)據(jù)源應(yīng)用程序開(kāi)發(fā)指南-內(nèi)容目錄...2007-02-02powerbuilder(pb)中 xml的應(yīng)用一例
powerbuilder中的數(shù)據(jù)窗口真是好的不得了,工作基本上都是圍繞它做,很高效,這幾天項(xiàng)目上需要用導(dǎo)出xml文件,就用pb9(xml導(dǎo)出導(dǎo)入功能是從powerbuilder9.0增加的功能)做了一個(gè)demo以驗(yàn)證可行性2009-06-06