之所以要引入xpath的概念,目的就是為了在匹配xml文件結構樹時能夠準確地找到某乙個節點元素。可以把xpath比作檔案管理路徑:通過檔案管理路徑,可以按照一定的規則查詢到所需要的檔案;同樣,依據xpath所制定的規則,也可以很方便地找到xml結構文件樹中的任何乙個節點.
不過,由於xpath可應用於不止乙個的標準,因此w3c將其獨立出來作為xslt的配套標準頒布,它是xslt以及我們後面要講到的xpointer的重要組成部分。
在介紹xpath的匹配規則之前,我們先來看一些有關xpath的基本概念。
首先要說的是xpath資料型別。xpath可分為四種資料型別:
節點集(node-set)
節點集是通過路徑匹配返回的符合條件的一組節點的集合。其它型別的資料不能轉換為節點集。
布林值(boolean)
由函式或布林表示式返回的條件匹配值,與一般語言中的布林值相同,有true和false兩個值。布林值可以和數值型別、字串型別相互轉換。
字串(string)
字串即包含一系列字元的集合,xpath中提供了一系列的字串函式。字串可與數值型別、布林值型別的資料相互轉換。
數值(number)
在xpath中數值為浮點數,可以是雙精度64位浮點數。另外包括一些數值的特殊描述,如非數值nan(not-a-number)、正無窮大infinity、負無窮大-infinity、正負0等等。number的整數值可以通過函式取得,另外,數值也可以和布林型別、字串型別相互轉換。
其中後三種資料型別與其它程式語言中相應的資料型別差不多,只是第一種資料型別是xml文件樹的特有產物。
另外,由於xpath包含的是對文件結構樹的一系列操作,因此搞清楚xpath節點型別也是很必要的。回憶一下第二章中講到的xml文件的邏輯結構,乙個xml檔案可以包含元素、cdata、注釋、處理指令等邏輯要素,其中元素還可以包含屬性,並可以利用屬性來定義命名空間。相應地,在xpath中,將節點劃分為七種節點型別:
根節點(root node)
根節點是一棵樹的最上層,根節點是唯一的。樹上其它所有元素節點都是它的子節點或後代節點。對根節點的處理機制與其它節點相同。在xslt中對樹的匹配總是先從根節點開始。
元素節點(element nodes)
元素節點對應於文件中的每乙個元素,乙個元素節點的子節點可以是元素節點、注釋節點、處理指令節點和文字節點。可以為元素節點定義乙個唯一的標識id。
元素節點都可以有副檔名,它是由兩部分組成的:一部分是命名空間uri,另一部分是本地的命名。
文字節點(text nodes)
文字節點包含了一組字元資料,即cdata中包含的字元。任何乙個文字節點都不會有緊鄰的兄弟文字節點,而且文字節點沒有副檔名。
屬性節點(attribute nodes)
每乙個元素節點有乙個相關聯的屬性節點集合,元素是每個屬性節點的父節點,但屬性節點卻不是其父元素的子節點。這就是說,通過查詢元素的子節點可以匹配出元素的屬性節點,但反過來不成立,只是單向的。再有,元素的屬性節點沒有共享性,也就是說不同的元素節點不共有同乙個屬性節點。
對預設屬性的處理等同於定義了的屬性。如果乙個屬性是在dtd宣告的,但宣告為#implied,而該屬性沒有在元素中定義,則該元素的屬性節點集中不包含該屬性。
此外,與屬性相對應的屬性節點都沒有命名空間的宣告。命名空間屬性對應著另一種型別的節點。
命名空間節點(namespace nodes)
每乙個元素節點都有乙個相關的命名空間節點集。在xml文件中,命名空間是通過保留屬性宣告的,因此,在xpath中,該類節點與屬性節點極為相似,它們與父元素之間的關係是單向的,並且不具有共享性。
處理指令節點(processing instruction nodes)
處理指令節點對應於xml文件中的每一條處理指令。它也有副檔名,副檔名的本地命名指向處理物件,而命名空間部分為空。
注釋節點(comment nodes)
注釋節點對應於文件中的注釋。
下面,我們來構造一棵xml文件樹,作為後面舉例的依託:
現在,我們就來介紹一些xpath中節點匹配的基本方法。
路徑匹配
路徑匹配與檔案路徑的表示相仿,比較好理解。有以下幾個符號:
符 號 含 義 舉 例 匹配結果
/ 指示節點路徑 /a/c/d 節點"a"的子節點"c"的子節點"d",即id值為d2的d節點
/ 根節點
// 所有路徑以"//"後指定的子路徑結尾的元素 //e 所有e元素,結果是所有三個e元素
//c/e 所有父節點為c的e元素,結果是id值為e1和e2的兩個e元素
* 路徑的萬用字元 /a/b/c/* a元素→b元素→c元素下的所有子元素,即name值為b的b元素、id值為d1的d元素和id值為e1和e2的兩個e元素
/*/*/d 上面有兩級節點的d元素,匹配結果是id值為d2的d元素
//* 所有的元素
| 邏輯或 //b | //c 所有b元素和c元素
位置匹配
對於每乙個元素,它的各個子元素是有序的。如:
舉 例 含 義 匹配結果
/a/b/c[1] a元素→b元素→c元素的第乙個子元素 name值為b的b元素
/a/b/c[last()] a元素→b元素→c元素的最後乙個子元素 id值為e2的e元素
/a/b/c[position()>1] a元素→b元素→c元素之下的位置號大於1的元素 id值為d1的d元素和兩個具有id值的e元素
屬性及屬性
在xpath中可以利用屬性及屬性值來匹配元素,要注意的是,元素的屬性名前要有"@"字首。例如:
舉 例 含 義 匹配結果
//b[@id] 所有具有屬性id的b元素 id值為b1和b2的兩個b元素
//b[@*] 所有具有屬性的b元素 兩個具有id屬性的b元素和乙個具有name屬性b元素
//b[not(@*)] 所有不具有屬性的b元素 a元素→c元素下的b元素
//b[@id="b1"] id值為b1的b元素 a元素下的b元素
親屬關係匹配
xml文件可歸結為樹型結構,因此任何乙個節點都不是孤立的。通常我們把節點之間的歸屬關係歸結為一種親屬關係,如父親、孩子、祖先、後代、兄弟等等。在對元素進行匹配時,同樣可以用到這些概念。例如:
舉 例 含 義 匹配結果
//e/parent::* 所有e節點的父節點元素 id值為a1的a元素和id值為c1的c元素
//f/ancestor::* 所有f元素的祖先節點元素 id值為a1的a元素和id值為c2的c元素
/a/child::* a的子元素 id值為b1、b2的b元素,id值為c2的c元素,以及沒有任何屬性的e元素
/a/descendant::* a的所有後代元素 除a元素以外的所有其它元素
//f/self::* 所有f的自身元素 f元素本身
//f/ancestor-or-self::* 所有f元素及它的祖先節點元素 f元素、f元素的父節點c元素和a元素
/a/c/descendant-or-self::* 所有a元素→c元素及它們的後代元素 id值為c2的c元素、該元素的子元素b、d、f元素
/a/c/following-sibling::* a元素→c元素的緊鄰的後序所有兄弟節點元素 沒有任何屬性的e元素
/a/c/preceding-sibling::* a元素→c元素的緊鄰的前面所有兄弟節點元素 id值為b1和b2的兩個b元素
/a/b/c/following::* a元素→b元素→c元素的後序的所有元素 id為b2的b元素、無屬性的c元素、無屬性的b元素、id為d2的d元素、無屬性的f元素、無屬性的e元素。
/a/c/preceding::* a元素→c元素的前面的所有元素 id為b2的b元素、id為e2的e元素、id為e1的e元素、id為d1的d元素、name為b的b元素、id為c1的c元素、id為b1的b元素
條件匹配
條件匹配就是利用一些函式的運算結果的布林值來匹配符合條件的節點。常用於條件匹配的函式有四大類:節點函式、字串函式、數值函式、布林函式。例如前面提到的last()、position()等等,這裡我們就不再贅述。
以上這些匹配方法中,用得最多的還要數路徑匹配。
XML中XPath的應用
xpath即為xml路徑語言,它是一種用來確定xml 標準通用標記語言的子集 文件中某部分位置的語言。xpath基於xml的樹狀結構,提供在資料結構樹中找尋節點的能力。起初 xpath 的提出的初衷是將其作為乙個通用的 介於xpointer與xslt間的語法模型。但是 xpath 很快的被開發者採用...
XML中的增刪改進 不用xpath
建立乙個xml檔案 用 實現 寫乙個xml檔案 建立乙個文件幫助類 document doc documenthelper.createdocument 現在是在記憶體中新增標籤 新增頭標籤 element rootelement doc.getrootelement 不能這麼寫 這是新增 add ...
XML學習 Xpath學習
使用xpath的套路 通過dom呼叫node中的如下方法,每個方法中的引數用 xpath表示式 string型 selectnodes xpath selectsinglenode xpath selectobject xpath selectnodes string xpathexpression...