<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent.Chan‘s Blog

    常用鏈接

    統(tǒng)計

    積分與排名

    網(wǎng)站

    最新評論

    實(shí)用數(shù)據(jù)綁定: 使用 XPath 作為數(shù)據(jù)綁定工具,第 1 部分:使用 XPath 選擇 XML 文檔部分

    級別: 中級

    Brett McLaughlin, 作家,編輯, O'Reilly Media, Inc.

    2005 年 12 月 22 日

    通 常人們不把 XPath 看作是一種數(shù)據(jù)綁定 API。除了作為其他規(guī)范的一部分以外,XPath 甚至還沒有引起 XML 世界的過多關(guān)注。但是只要真正理解了 XPath 是什么以及如何使用它,特別是在 Java? 編程環(huán)境中,它就會成為一種強(qiáng)大的數(shù)據(jù)綁定工具,常常優(yōu)于傳統(tǒng)的數(shù)據(jù)綁定 API 如 JAXB 或 JaxMe。Brett McLaughlin 的 “實(shí)用數(shù)據(jù)綁定” 專欄首先用兩期文章探討了作為數(shù)據(jù)綁定工具的 XPath。

    到目前為止,本專欄一直專注于數(shù)據(jù)綁定的傳統(tǒng)定義和用法:將 XML 文檔轉(zhuǎn)換成 Java 表示并用于通常的 Java 方法中(比如 getName()setAddress())。 然后將 Java 對象再轉(zhuǎn)換成 XML 表示,通常序列化(保存)到磁盤。我還討論過另一種方向的轉(zhuǎn)換,即把 Java 對象轉(zhuǎn)換成 XML, 然后使用轉(zhuǎn)換的 XML(可以通過網(wǎng)絡(luò)連接發(fā)送出去,或者作為應(yīng)用程序中另一個消費(fèi) XML 的組件的輸入)。這都是非常有效和實(shí)用的數(shù)據(jù)綁定的用例,但是還沒有包括所有的可能性。本文和下一期文章將介紹另一種方法,即使用 XPath 技術(shù)進(jìn)行數(shù)據(jù)綁定。

    如果您使用數(shù)據(jù)綁定很長時間了,通常會提供一個約束集(比如 XML 模式或 DTD),用 API 生成表示該約束集的類。然后使用這些類加載 XML 數(shù)據(jù),將其中的數(shù)據(jù)序列化為 XML。這是一種完善的解決方案,但是并非惟一的不使用 SAX 或 DOM 等底層 API 從 XML 文檔中讀取數(shù)據(jù)的方法。XPath,您可能聽說過這種規(guī)范,就是另一種方法。即使您沒有 聽說過 XPath,也可能在某些時候已經(jīng)用到過它。通過本文,您將了解 XPath 是什么,知道如何使用它,看看它為什么像一種數(shù)據(jù)綁定 API,甚至可以漂亮地完成其他數(shù)據(jù)綁定任務(wù)很難實(shí)現(xiàn)的工作。

    總是為他人作嫁衣……

    XPath 是最常用而不為人知的 XML 技術(shù)之一。它實(shí)際上是 常用的 XML 技術(shù) —— XML 轉(zhuǎn)換必不可少的組成部分。在將來的 Web 中它也起著重要的作用,因?yàn)樗鼘?XLink 和(特別是) XPointer 至關(guān)重要。甚至 XForms 也暗中要用到它。

    那么人們?yōu)槭裁床话?XPath 看作一種獨(dú)立的技術(shù)呢?很大程度上是因?yàn)槠渌Z言中獨(dú)立處理 XPath 的 API 還剛剛出現(xiàn)。但是如果使用過 XSLT 或 XPointer,或者處理過更先進(jìn)的 XML Schema,那么您可能已經(jīng)走到前面了。

    XPath 在 XSLT 中的作用

    如果使用過 XSLT,幾乎可以肯定曾經(jīng)看到過 XPath 而且至少在一定程度上看著面熟,即使您并沒有意識到。看一看 清單 1,這是一個非常簡單的 XSL 樣式表的一部分。


    清單 1. XSL 樣式表中的 XPath
    												
    														

    <xsl:template match="address">
    <h1>Addresses</h1>
    <hr />
    <table>
    <tr><th>Street</th><th>City</th><th>State</th><th>Zip Code</th></tr>
    <xsl:apply-templates select="address" />
    </table>
    </xsl:template>
    <xsl:template match="address" />
    <tr>
    <td><xsl:value-of select="street" /></td>
    <td><xsl:value-of select="city" /></td>
    <td><xsl:value-of select="state" /></td>
    <td><xsl:value-of select="zipCode" /></td>
    </tr>
    </xsl:template>

    比方說,當(dāng)您看到 select="address" 或者 select="zipCode" 的時候,您看到的就是應(yīng)用中的 XPath。包圍在引號中的文本就是 XPath 表達(dá)式,盡管非常簡單,要讓樣式表工作卻是不可或缺的。

    實(shí)際上,即使編寫最簡單的 XML 轉(zhuǎn)換,如果樣式表中沒有 select 會怎么樣?根本不可能!這是因?yàn)?XPath 是 XML 轉(zhuǎn)換從而也是 XSLT 的完整的一部分。如果您認(rèn)為自己是一位 XSL 專家,您可能比自己認(rèn)為的更熟悉 XPath。

    XPointer 中的 XPath

    XPointer 是另一種大量使用 XPath 的 API,盡管不像 XSL 那么常用,但是也逐漸展露頭角。清單 2 展示了一篇文檔中指向另一篇文檔的鏈接。


    清單 2. XPointer 上下文中 XPath 的用法
    												
    														

    <link xmlns:xlink="http://www.w3.org/2000/xlink"
    xlink:type="simple"
    xlink:href="cd.xml#xpointer(
    /cds/cd[@title='August and Everything After'])">

    要考慮的一些問題

    注意指向 XML 文檔的一部分的 XPath 代碼例子。XPath 表達(dá)式?jīng)]有涉及到元素或?qū)傩裕侵苯影瑢@些 XML 結(jié)構(gòu)名稱的引用。這應(yīng)該讓您想起數(shù)據(jù)綁定。

    這是一段稍微復(fù)雜的 XPath。它選擇了根元素 cds 中的 cd 元素,該元素有一個 title 屬性等于 August and Everything After,這些內(nèi)容都在 cd.xml 文檔中。討論這些似乎有點(diǎn)為時過早,但是先不要擔(dān)心語法。關(guān)鍵是要看到 XPointer 和 XSL 一樣大量使用了 XPath,事實(shí)上沒有它 XPointer 就無法存在。再說一次,XPath 是用于選擇數(shù)據(jù)的重要組件。

    在 XForms 中使用 XPath

    XForms 是一種相對較新的 XML 技術(shù),比不上 XSL 普及,甚至還比不上 XPointer 或 XLink。但是仍然值得提一下,因?yàn)樗?input 元素的 ref 屬性中使用 XPath 表達(dá)式。可以設(shè)置一個 input 并將其綁定到 XML 文檔中的特定元素(或?qū)傩裕?清單 3 所示。


    清單 3. XForms 組件使用 XPath 引用綁定到表單的 XML 文檔
    												
    														

    <input ref="xhtml:html/body/xhtml:p[@id='greentea']/
    xhtml:description" />

    清單 3 中的 XForms 語句將輸入控件綁定到 XHTML 文檔的特定元素。在這里 XPath 同樣是指定具體元素的關(guān)鍵。后面將提到它允許使用一些非常高級的選擇條件。

    在很大程度上 XForms 是一種尚未得到支持的技術(shù),但是當(dāng)使用 XForms 的時候,現(xiàn)在學(xué)習(xí)的 XPath 是一種很好的工具。將這些關(guān)于 XSL、XLink 和 XInclude 的知識結(jié)合起來就夠了!





    回頁首


    選擇內(nèi)容:基礎(chǔ)

    現(xiàn)在您已經(jīng)確信 XPath 非常有用而且無處不在了,下面開始學(xué)習(xí)語法吧。如果剛接觸 XPath,本課程將幫助您開始學(xué)習(xí)和領(lǐng)會 XPath 的結(jié)構(gòu)。如果是一位 XSL 或 XLink 和 XPointer 老手,也可了解為什么 要構(gòu)造那些奇怪的路徑。您可能已經(jīng)知道獲取感興趣的數(shù)據(jù)的其他方法,也許是更好的方法。

    首先要認(rèn)識到稱 XPath 為一種語言有點(diǎn)過于鄭重其事。它實(shí)際上是選擇和處理 XML 文檔中的內(nèi)容的一種語法。即使在 XPath 中使用的函數(shù)和運(yùn)算符也都與選擇有關(guān)。在 XPath 中不會創(chuàng)建變量,比方說不可能運(yùn)行 一個 XPath 程序。沒有這些東西。如果您開始認(rèn)識到 XPath 是一種巧妙的、有益的選擇 XML 元素和屬性的方法,然后使用選擇的值,您就已經(jīng)領(lǐng)先于大多數(shù) XML 開發(fā)人員了。XPath 不是要對 XML 什么事情,而是要 XML 中取得一些內(nèi)容。

    選擇元素

    設(shè)置上下文

    設(shè)置上下文不是 XPath 的工作。事實(shí)上,根本不能 用 XPath 設(shè)置上下文。相反,要用其他使用 XPath 在文檔中導(dǎo)航的 API 來設(shè)置上下文。比如,XSLT 根據(jù)應(yīng)用的模板設(shè)置上下文,XForms(一般來說)每次都從根上下文開始。因此理解上下文更多的是需要了解使用 XPath 的 API,而不是 XPath 本身。

    對于 XPath 來說第一步是找到一個引用元素的句柄。可是在選擇元素之前需要理解當(dāng)前上下文。上下文就是在 XML 文檔中的位置。比方說,您可能在根元素上,那根元素就是上下文。當(dāng)然也可能在第一個 person 元素的第二個 address 元素上。在開始移動和選擇內(nèi)容之前,需要知道上下文。

    只要理解了上下文,就可以掌握 XPath 語法了。以 清單 4 中的 XHTML 文檔為例。


    清單 4. Head First Lounge 的 XHTML
    												
    														

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
    <head>
    <meta http-equiv="Content-Type" content="text/html;
    charset=ISO-8859-1" />
    <title>Head First Lounge Elixirs</title>
    <link type="text/css" rel="stylesheet" href="../lounge.css" />
    </head>
    <body>
    <h1>Our Elixirs</h1>
    <h2>Green Tea Cooler</h2>
    <p class="greentea">
    <img src="../images/green.jpg" alt="Green Tea Cooler" />
    Chock full of vitamins and minerals, this elixir
    combines the healthful benefits of green tea with
    a twist of chamomile blossoms and ginger root.
    </p>
    <h2>Raspberry Ice Concentration</h2>
    <p class="raspberry">
    <img src="../images/lightblue.jpg"
    alt="Raspberry Ice Concentration" />
    Combining raspberry juice with lemon grass,
    citrus peel and rosehips, this icy drink
    will make your mind feel clear and crisp.
    </p>

    <h2>Blueberry Bliss Elixir</h2>
    <p class="blueberry">
    <img src="../images/blue.jpg" alt="Blueberry Bliss Elixir" />
    Blueberries and cherry essence mixed into a base
    of elderflower herb tea will put you in a relaxed
    state of bliss in no time.
    </p>
    <h2>Cranberry Antioxidant Blast</h2>
    <p>
    <img src="../images/red.jpg" alt="Cranberry Antioxidant Blast" />
    Wake up to the flavors of cranberry and hibiscus
    in this vitamin C rich elixir.
    </p>
    <p>
    <a href="../lounge.html">Back to the Lounge</a>
    </p>
    </body>
    </html>

    如果在 清單 4 中的上下文是 html 元素,就可以直接使用名稱選擇一個子元素。比如選擇 body 元素可使用 XPath 表達(dá)式 body。如果想訪問嵌套在 body 中的 h1 元素則使用 body/h1。如果認(rèn)為這有點(diǎn)類似于目錄路徑,那么就對了。選擇元素使用 元素名/子元素名 這樣的形式。

    不過在前進(jìn)之前要認(rèn)識到 XPath 表達(dá)式可能返回多個 元素。結(jié)果元素集稱為節(jié)點(diǎn)集。(事實(shí)上,用 XPath 選擇的所有實(shí)體 —— 元素、屬性和值 —— 都稱為節(jié)點(diǎn)。)比如下面的路徑:

    												body/p
    										

    清單 4body 有五個不同的 p 子元素,因此那個表達(dá)式返回包含五個節(jié)點(diǎn)的節(jié)點(diǎn)集(正如您所期望的, 只是第一個 p 元素)。注意,有時候您得到了預(yù)期的結(jié)果,但是很可能比您打算 要求的多。

    還有更多需要注意的地方。現(xiàn)在給出的表達(dá)式僅僅返回實(shí)際的元素。可能還要獲得這些節(jié)點(diǎn)的值。如果需要元素的值(假設(shè)元素包含文本數(shù)據(jù)),需要使用 text() 函數(shù)。要獲得第一個 h1 的文本,應(yīng)使用 body/h1/text(),對于清單 4 將返回 Our Elixirs

    選擇屬性

    當(dāng)然可以選擇的不僅僅是元素。前面已經(jīng)提到還可以選擇屬性。選擇屬性的時候要在屬性名前使用 @ 符號,其他方面和元素都一樣。

    再回到 清單 4 這個例子,可以使用 head/meta/@http-equiv 返回 meta 元素 http-equiv 屬性的值。類似地,head/link/@type 返回 link 元素的 type 屬性。

    必須知道,選擇屬性的時候您得到的是它的值,而不像元素那樣返回節(jié)點(diǎn)。因此對于屬性選擇器,返回值(雖然不確切但是很有用)是一個值,對于一個元素則是一個節(jié)點(diǎn)集(包含一個節(jié)點(diǎn))。

    在文檔中移動

    目前為止看到的都是理想的情況,特別是使用文檔的根作為上下文比較簡單。但是顯然情況并非總是如此。這正是目錄結(jié)構(gòu)的真正有用的地方。要從當(dāng)前上下文移動到上一級,只要使用 .. 運(yùn)算符。比方說,假設(shè)上下文是 body 元素,現(xiàn)在需要獲得網(wǎng)頁的標(biāo)題(包含在文檔 head 下的 title 元素中),可以使用 ../head/title/text()。如果您開始感覺到就像是改變 UNIX 或 Mac OS X 終端上的目錄,這就對了!

    如果上下文是 body 中第二個 pimg 元素,要得到標(biāo)題該怎么辦呢?可以使用 ../../../head/title/text()。但是數(shù)這些 ../ 很快就變得單調(diào)乏味了。因此能直接跳到根元素就好了,再想一想 UNIX,使用 / 返回到根元素就毫不奇怪了。同樣的選擇器更簡單的形式為 /html/head/title/text()。雖然沒有縮短,但是更清楚了。有了 ..// 之后,基本上就能移動到需要的任何地方了。

    多重選擇

    考慮到使用一個 XPath 表達(dá)式可以選擇多個節(jié)點(diǎn),事情就更有趣了。您可以使用對應(yīng)多個節(jié)點(diǎn)的簡單表達(dá)式,比如 /html/body/h2 來進(jìn)行多重選擇。但是也可使用通配符 進(jìn)一步精化這些選擇。XPath 中有三個統(tǒng)配符:

    • * 與任何元素匹配,無論元素名是什么
    • node() 與所有的節(jié)點(diǎn)類型匹配(元素、文本節(jié)點(diǎn)、注釋、屬性,等等)
    • @* 與所有的屬性節(jié)點(diǎn)匹配,無論屬性名是什么

    比如,可以使用 /html/body/* 選擇 body 元素的所有直接子元素。也可用 /html/head/meta/@* 選擇 meta 標(biāo)記的所有屬性。

    所有這些情況下,要記住您得到的是一個節(jié)點(diǎn)集,因此不應(yīng)該滿足于處理某個值就結(jié)束(除非您已經(jīng)選擇了一個屬性,稍后要講到)。但是,只要使用方法、函數(shù)或模板處理多個節(jié)點(diǎn),這些技術(shù)就很重要。





    回頁首


    更有趣的東西

    基本的東西很好,但有時候還需要點(diǎn)特別的讓您身邊的同事眼花繚亂的東西,或者需要一點(diǎn)特殊的 功能。這種情況下這些基礎(chǔ)可能就不夠了。雖然很難巨細(xì)無遺地介紹 XPath,但下面給出一些高級技巧,可以幫助您在 XPath 應(yīng)用程序中取得需要的節(jié)點(diǎn)(或節(jié)點(diǎn)集)。

    更大的一般性

    到目前為止,看到的路徑都是選擇一個節(jié)點(diǎn),并假設(shè)您知道該節(jié)點(diǎn)在何處。比方說,您知道 titleimgp 在文檔中什么位置,只需要導(dǎo)航到這些元素。但有時候可能希望打破這些結(jié)構(gòu),僅僅擷取某種元素而不管其位置(或者無論給定的起始上下文的位置)。為此可使用后代選擇器

    后代選擇器用雙斜線 // 表示。使用它告訴 XPath 選擇所有指定的節(jié)點(diǎn),無論嵌套得多深。比如這個簡單的特定于 XHTML 的 XPath:

    												/html/body//table
    										

    XPath 選擇嵌套在 XHTML 的 body 元素中的所有table 元素,不論直接嵌套在 body 中(如 /html/body/table),還是嵌套了多層(如 /html/body/table/tr/td/table)。這種情況下,嵌套的 table 和頂層 table 同時被選中。

    不是很合 XML 的風(fēng)格

    在標(biāo)準(zhǔn) XML 術(shù)語中,屬性不屬于 元素,而是與元素關(guān)聯(lián),有時候也說在元素上。但是,XPath 不能處理元素及其屬性之間的關(guān)系。因此只能盡自己最大的努力:將屬性看作是屬于它們所在的元素。因此選擇 pclass 屬性要使用 p/@class。要訪問屬性所在的元素,可使用 @class/..。實(shí)際上是從屬性上移 一層而選擇元素。從技術(shù)上說這不是很好的 XML,但卻是完全正確的 XPath。

    當(dāng)與屬性結(jié)合使用的時候就變得很有趣了(使用 @)。比方說,假設(shè)要選擇具有 id 屬性的所有元素。可使用 //@id,首先跳回根元素然后選擇文檔中的所有 id 屬性。但是實(shí)際上要訪問的是元素而不是屬性,因此需要從屬性上移一層到包含這些屬性的元素:

    												//@id/..
    										

    您應(yīng)該嘗試結(jié)合這些不同的方法,會看到一些很有意思的結(jié)果。

    匹配條件

    假設(shè)有一個條件希望作為匹配的基礎(chǔ),比如需要 class 屬性值為 greenteap 元素。如果知道如何使用方括號,這一點(diǎn)在 XPath 中很容易做到。下面是一個例子:

    												
    														
    /html/body/p[class="greentea"]

    方括號用于指定條件,可使用 = 甚至 <>。也許要用一個范圍更廣的表達(dá)式:

    												
    														
    //p[class="greentea"]

    明白了嗎?甚至還能更進(jìn)一步,選擇屬于 greentea 類的所有 元素而不論其元素類型是什么:

    												
    														
    //@class[.="greentea"]/..

    這個表達(dá)式可能看起來有點(diǎn)奇怪,但很容易解釋。首先,// 意味著從根元素開始選擇所有的元素(與后面的選擇器及條件匹配)而不論其嵌套的位置。然后 @class 選擇文檔中所有的 class 屬性。后面的 [.="greentea"] 有點(diǎn)神秘。="greentea" 部分容易理解,它用 greentea 匹配等式左側(cè)的值。在這里就是 .,這個標(biāo)志還沒有見到過。但是再想一想目錄,.. 選擇父節(jié)點(diǎn)(或者父目錄),. 則選擇當(dāng)前節(jié)點(diǎn)。因此 //@class[.="greentea"] 選擇值為 greentea 的所有 class 屬性。然后再移動到這些屬性所在的元素:

    												
    														
    //@class[.="greentea"]/..

    現(xiàn)在看起來有點(diǎn)不可思議,但是應(yīng)該熟悉這類奇怪的表達(dá)式。當(dāng)需要訪問特定的元素、屬性或節(jié)點(diǎn)集時它們很有用。

    計算

    隨著越來越多的使用屬性選擇器,最終將與處理節(jié)點(diǎn)一樣經(jīng)常地使用值(來自屬性)。如果處理過非常典型的 XML,一定會遇到數(shù)字。XML 文檔常常把數(shù)字值放在屬性中(有時候在元素中)。因此這一節(jié)討論 /people/person[firstname = "John"]/@born/people/person/numChildren/text() 這類表達(dá)式的結(jié)果(當(dāng)然,使用元素表示子女的個數(shù)不夠典型,不過就用下面的例子吧)。

    這時候您會發(fā)現(xiàn) XPath 的計算能力很有用。可以像其他編程語言中那樣使用 +-*。此外 div 用于除法,mod 則表示求模(兩數(shù)相除的余數(shù))。比如,假設(shè) XML 文檔中包含用四位數(shù)表示的出生年份,現(xiàn)在需要改成兩位數(shù)的形式,首先用下面的表達(dá)式取得實(shí)際的出生年份:

    												
    														
    /people/person/birthdate/@year

    這樣就得到了出生年份(可能是 1976 或者 1945)。然后只需要減去 1900:

    												
    														
    (/people/person/birthdate/@year) - 1900

    當(dāng)然這種方法很有限,新千年出生的孩子和那些歷史人物都會造成這一公式的失敗。因此應(yīng)該用 mod

    												
    														
    (/people/person/birthdate/@year) mod 100

    (順便說一下,應(yīng)該告訴那些研究 Y2K 的人您省略了年份的前兩位數(shù)。)

    字符串技巧

    最后,XPath 還提供了一些很棒的字符串處理功能。XML 基本上都是文本,屬性值和元素中的數(shù)據(jù)通常是文本,因此不用奇怪 XPath 支持某些字符串操作。下面僅僅是 XPath 提供的處理字符串的少數(shù)函數(shù):

    • string() 將數(shù)據(jù)轉(zhuǎn)換成字符串格式,如果還不是字符串的話。
    • starts-with(full-string, start-string) 返回一個 Boolean 值,檢查 full-string 是否以 start-string 開始。
    • contains(full-string, contains-string) 返回一個 boolean 值,檢查 full-string 是否包含 contains-string
    • string-length(string) 返回 string 的長度。
    • normalize-space(string) 去掉 string 兩端和內(nèi)部的空格。

    大部分函數(shù)的功能都很明確。starts-with("McLaughlin", "Mc") 返回 truecontains("McLaughlin", "augh") 同樣如此。string-length("Brett") 顯然返回 5normalize-space(" Brett McLaughlin ") 則返回 "Brett McLaughlin"。是不是很簡單?當(dāng)然這些可用于所有 XPath 表達(dá)式的返回值,比如 /html/body/p[class='greentea']。因此要獲取 清單 4p 的文本可用 normalize-space()

    												
    														
    normalize-space(/html/body/p[class='greentea'])

    更妙的是可用 string() 取出多個元素的文本。比如,如果希望取得 清單 4 所示 XHTML 中所有p 元素的所有 文本,可用:

    												normalize-space(string(//p))
    										

    分析最后一個例子可以了解很多內(nèi)容:

    1. //p 選擇文檔中所有的 p 元素,無論其位于何處。
    2. string(//p) 獲取這些元素的內(nèi)容組成一個大字符串。但是字符串中包含很多無用的空白,因此還要進(jìn)一步處理。
    3. normalize-space(string(//p)) 規(guī)范化內(nèi)容中的空白字符,得到您希望的文本。




    回頁首


    這是一篇關(guān)于數(shù)據(jù)綁定的文章嗎?

    現(xiàn) 在您可能已經(jīng)忘記正在閱讀的是一篇關(guān)于數(shù)據(jù)綁定的文章。但是先不要忙于跟過去幾年中您讀過的其他 X* 文檔和 API 比較。您讀到的實(shí)際上是另一種數(shù)據(jù)綁定方法。考慮這樣一種觀點(diǎn),數(shù)據(jù)綁定是在 Java 代碼中保留 XML 文檔邏輯(或者語義,如果您喜歡的話)意義。如果 XML 文檔中的 address 元素包含 streetcitystate 子元素,想要用 getAddress().getStreet() 這樣的形式得到這些元素的值,比如:

    												
    														
    Address address = getAddress();
    System.out.println(address.getCity() + ", " + address.getState());

    這就是某種基本的數(shù)據(jù)綁定形式。但是在 XPath 中也能做到同樣的事!可以利用 address/street/text() 或者 /person[last-name="Gosling"]/address[@type="work"]/city 這樣的 XPath 表達(dá)式來得到街道名。初看起來與前一個例子不同,但是它仍然合理地使用了 XML 數(shù)據(jù),您要的是 personaddressstreet 而不是第一個子元素第二個文本節(jié)點(diǎn) 或者屬性。這一點(diǎn)至關(guān)重要。XPath 按照邏輯而不是結(jié)構(gòu)來處理 XML。基本上數(shù)據(jù)綁定也是如此,按照邏輯處理數(shù)據(jù),而不用擔(dān)心其結(jié)構(gòu)。

    為了避免誤導(dǎo),需要指出使用 XPath 仍然需要對結(jié)構(gòu)有所了解。比如,@ 運(yùn)算符只用于屬性,因此必須知道 type(地址的一部分)用元素還是屬性表示。在傳統(tǒng)的數(shù)據(jù)綁定中,只需要調(diào)用 getAddress().getType() 而不需要管結(jié)構(gòu)的層次。但是,這點(diǎn)小小的代價是值得的,因?yàn)椴恍枰幚泶罅康纳深悺㈩~外的類路徑問題、等待封送和解除封送處理以及傳統(tǒng)數(shù)據(jù)綁定的其他缺點(diǎn)。

    只 剩下這個等式中需要在 Java 語言中增加的部分:接受 XML 文檔和 XPath 表達(dá)式,以 Java 友好的方式獲得表達(dá)式的結(jié)果。這些內(nèi)容將在第 2 部分介紹,很快就要把 XPath 與 Java 編程中其他以 XML 為中心的工具一起使用了。很多情況下您會發(fā)現(xiàn),與使用生成類和 JAXB 這樣的 API 的工具相比,XPath 是一種更好的 數(shù)據(jù)綁定工具。





    回頁首


    參考資料





    回頁首


    關(guān)于作者

    Brett McLaughlin 的照片

    Brett McLaughlin 從 Logo 時代就開始使用計算機(jī)。(還記得那個小三角嗎?)近年來他已經(jīng)成為 Java 技術(shù)和 XML 社區(qū)最知名的作家和程序員之一。他曾經(jīng)在 Nextel Communications 實(shí)現(xiàn)過復(fù)雜的企業(yè)系統(tǒng),在 Lutris Technologies 編寫應(yīng)用程序服務(wù)器,最近在 O'Reilly Media, Inc. 繼續(xù)撰寫和編輯這方面的圖書。在他的新書 Head Rush Ajax 中,Brett 與暢銷書作家 Eric 及 Beth Freeman 為 Ajax 帶來了獲獎的創(chuàng)新方法 Head First。最近的著作 Java 1.5 Tiger: A Developer's Notebook 是關(guān)于這一 Java 技術(shù)新版本的第一本書籍,經(jīng)典著作 Java and XML 仍然是在 Java 語言中使用 XML 技術(shù)的權(quán)威圖書。


    posted on 2006-03-18 20:47 Vincent.Chen 閱讀(588) 評論(0)  編輯  收藏 所屬分類: AJAX

    主站蜘蛛池模板: 亚洲综合国产精品第一页| 男男gay做爽爽免费视频| 亚洲午夜精品一级在线播放放| 国产免费女女脚奴视频网 | 亚洲av无码天堂一区二区三区 | 亚洲AV人无码激艳猛片| 亚洲精品国产V片在线观看| 成人免费看吃奶视频网站| 在线免费观看你懂的| 国产麻豆成人传媒免费观看| 全部在线播放免费毛片| 亚洲AV成人无码久久WWW| 亚洲综合丁香婷婷六月香| 久久久无码精品亚洲日韩京东传媒| 亚洲高清国产AV拍精品青青草原| 亚洲A∨精品一区二区三区| 一个人看www在线高清免费看| 18禁美女黄网站色大片免费观看 | 亚洲国产精品VA在线看黑人| 国产精品亚洲视频| 亚洲色婷婷综合开心网| 亚洲AV无码乱码精品国产| 国产一区二区免费在线| 国产成人高清精品免费软件| 免费观看一级毛片| 夫妻免费无码V看片| 女人18毛片水真多免费播放| 日本人护士免费xxxx视频| 在线a毛片免费视频观看| 卡一卡二卡三在线入口免费| 免费看的黄色大片| 免费观看国产小粉嫩喷水| 亚洲精品在线视频| 亚洲综合国产精品第一页| 亚洲精品午夜无码专区| 亚洲AV无码乱码在线观看裸奔| 亚洲AV成人一区二区三区AV| 亚洲国产成人久久精品动漫| 亚洲精品不卡视频| 亚洲一区免费视频| 亚洲乱码日产精品一二三|