用XPath精確定位節點元素

2021-04-01 23:12:32 字數 3654 閱讀 9179

用xpath精確定位節點元素

之所以要在xsl中引入xpath的概念,目的就是為了在匹配xml文件結構樹時能夠準確 地找到某乙個節點元素。可以把xpath比作檔案管理路徑:通過檔案管理路徑,可以 按照一定的規則查詢到所需要的檔案;同樣,依據xpath所制定的規則,也可以很方 便地找到xml結構文件樹中的任何乙個節點,顯然這對xslt來說是乙個最最基本的功能。

xpath資料型別

xpath可分為四種資料型別:

其中後三種資料型別與其它程式語言中相應的資料型別差不多,只是第一種資料型別是xml文件樹的特有產物。

xpath節點型別

另外,由於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文件樹

我們來構造一棵xml文件樹,作為後面舉例的依託:

以下將要介紹一些xpath中節點匹配的基本方法。

路徑匹配

路徑匹配與檔案路徑的表示相仿,比較好理解。有以下幾個符號:

(1)用「/」指示節點路徑

如「/a/c/d」 表示節點"a"的子節點"c"的子節點"d",即id值為d2的d節點, 「/」表示根節點。

(2)用「//」 表示所有路徑以"//"後指定的子路徑結尾的元素

如「//e」 表示所有e元素,結果是所有三個e元素, 如「//c/e」表示所有父節點為c的e元素,結果是id值為e1和e2的兩個e元素 。

(3)用「*」 表示路徑的萬用字元

如「/a/b/c/*」表示 a元素→b元素→c元素下的所有子元素,即name值為b的b元素、 id值為d1的d元素和id值為e1和e2的兩個e元素

「/*/*/d」表示上面有兩級節點的d元素,匹配結果是id值為d2的d元素 , 如「//*」表示所有的元素。

位置匹配

對於每乙個元素,它的各個子元素是有序的。

如:/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()等等,這裡我們就不再贅述。

以上這些匹配方法中,用得最多的還要數路徑匹配。在上一章樣式表的例子中, 無論是在語句中,還是在語句 中,都是依靠給出相對於當前路徑的子路 徑來定位節點的。

用XPath精確定位節點元素

用xpath精確定位節點元素 之所以要在xsl中引入xpath的概念,目的就是為了在匹配xml文件結構樹時能夠準確 地找到某乙個節點元素。可以把xpath比作檔案管理路徑 通過檔案管理路徑,可以 按照一定的規則查詢到所需要的檔案 同樣,依據xpath所制定的規則,也可以很方 便地找到xml結構文件樹...

使用Xpath軸定位當前元素節點的節點集

自動化測試在定位頁面元素時,無法直接使用當前節點屬性定位。而如果使用全路徑定位,造成定位方法值過長,穩定性欠缺,給後期指令碼維護造成困難。示例 1 通過當前節點定位父節點指定子節點元素。上圖所示 通過1的name定位2的元素。xpath示例 name 銀行卡 parent child last 2 ...

selenium元素定位Xpath

1.絕對路徑定位 用標籤的層級關係來定位元素,最外層語言為html,接著是body,一級一級的往下找,如果同一級,有多個相同的標籤,那麼按照上下順序確定第幾個,例 div 2 表示當前層級下第二個div 2.元素屬性定位 利用元素的屬性來定位元素 find element by xpath 元素名或...