XPath 語法筆記
- XPath 表達式
- 運算符
- 謂語(Predicates)
- 1. 選擇所有本地名稱為特定名稱的元素
- 2. 選擇具有特定屬性的元素
- 3. 選擇屬性值不等于特定值的元素
- 4. 選擇元素內容中包含特定字符串的節點
- 5. 選擇元素內容中不包含特定字符串的節點
- 6. 選擇特定命名空間內的元素
- 7. 選擇元素的屬性
- 8. 選擇元素的所有屬性
- 9. 選擇所有子孫元素
- 10. 選擇當前節點的父節點
- 參考資料
XPath 表達式
- 當使用命名空間時,確保在XPath引擎中正確聲明命名空間的前綴和URI。
表達式 | 說明 |
---|---|
nodename | 選擇 nodename 節點的所有子節點 |
/ | 單斜杠表示絕對路徑。它總是從XML文檔的根節點開始 |
// | 雙斜杠表示任意深度的后代路徑 |
. | 代表當前節點 |
.. | 代表當前節點的父節點 |
* | 匹配任意節點 |
//* | 當前文檔的所有元素(任意深度 + 任意節點) |
@* | 選擇所有屬性。 放在[@*] 中,表示帶任何屬性 |
local-name() | 使用此函數時,XPath會忽略命名空間,只考慮元素的本地名稱 |
[] | 謂語(Predicates)[] 用于填寫匹配條件 |
運算符
下面是XPath支持的運算符及其說明和示例的表格:
運算符 | 說明 | 舉例 |
---|---|---|
= | 等于比較 | price = 10 |
!= | 不等于比較 | price != 10 |
< | 小于比較 | year < 2000 |
<= | 小于等于比較 | year <= 2000 |
> | 大于比較 | quantity > 5 |
>= | 大于等于比較 | quantity >= 5 |
+ | 加法運算 | sum + 10 |
- | 減法運算 | total - sum |
* | 乘法運算 | width * height |
div | XPath 2.0 開始 除法運算 | 4 div 2 |
mod | 取模運算 | 10 mod 3 |
and | 邏輯與 | status = 'active' and year > 2000 |
or | 邏輯或 | status = 'active' or status = 'pending' |
union | 集合并集 | set1 union set2 |
| | 節點集并集 | nodeList1 | nodeList2 |
? | XPath 3.0 引入的序列類型測試 | xs:int() ? 1 |
注意:?
運算符是XPath 3.0及更高版本引入的,用于序列類型測試,不適用于所有XPath版本。在實際使用中,應根據XPath版本選擇適用的運算符。
謂語(Predicates)
方括號中的謂語可以是任何表達式,只要它能返回一個布爾值。這可以是屬性測試、位置測試或任何其他邏輯表達式。
- 過濾節點集合。
- 檢索滿足特定條件的節點。
- 訪問節點的屬性或計算表達式的值。
例如:
book[price > 30]
選擇所有price
屬性大于30的book
元素。*/chapter[title='Introduction']
選擇所有子元素中標題為"Introduction"的chapter
元素。
1. 選擇所有本地名稱為特定名稱的元素
- 表達式:
//*[local-name()='elementName']
- 示例: 若要選擇所有本地名稱為
sym
的元素,可以使用.//*[local-name()='sym']
2. 選擇具有特定屬性的元素
- 表達式:
//*[local-name()='elementName' and @attributeName='value']
- 示例: 若要選擇所有本地名稱為
sym
且w:font
屬性值為"Arial"
的元素,可以使用
選取所有帶有屬性的.//*[local-name()='sym' and @w:font='Arial']
sym
元素。.//*[local-name()='sym' and @*]
3. 選擇屬性值不等于特定值的元素
- 表達式:
//*[local-name()='elementName'][not(@attributeName='value')]
- 示例: 若要選擇所有本地名稱為
sym
但w:font
屬性值不為"Arial"
的元素,可以使用.//*[local-name()='sym'][not(@w:font='Arial')]
4. 選擇元素內容中包含特定字符串的節點
- 表達式:
//*[contains(text(), 'string')]
- 示例: 若要選擇所有內容中包含單詞
example
的段落,可以使用//p[contains(text(), 'example')]
5. 選擇元素內容中不包含特定字符串的節點
- 表達式:
//*[not(contains(text(), 'string'))]
- 示例: 若要選擇所有內容中不包含單詞
example
的段落,可以使用//p[not(contains(text(), 'example'))]
6. 選擇特定命名空間內的元素
- 表達式:
//namespace:elementName
- 示例: 若要選擇
http://schemas.openxmlformats.org/wordprocessingml/2006/main
命名空間下的所有sym
元素,可以使用(其中w
命名空間必須在XPath引擎中被正確聲明。)//w:sym
7. 選擇元素的屬性
- 表達式:
//*[local-name()='elementName']/@attributeName
- 示例: 若要選擇所有
sym
元素的w:char
屬性,可以使用.//*[local-name()='sym']/@w:char
8. 選擇元素的所有屬性
- 表達式:
//*[local-name()='elementName']/@*
- 示例: 若要選擇所有
sym
元素的所有屬性,可以使用.//*[local-name()='sym']/@*
9. 選擇所有子孫元素
- 表達式:
//elementName
- 示例: 若要選擇文檔中所有的
p
元素,無論它們處于哪個層級,可以使用//p
10. 選擇當前節點的父節點
- 表達式:
..
- 示例: 如果當前節點是
<p>...</p>
,那么..
將指向包含它的父節點。..
參考資料
XPath 1.0 規范: https://www.w3.org/TR/xpath/
XPath 2.0 規范: https://www.w3.org/TR/xpath-20/
XPath 3.1 規范: https://www.w3.org/TR/xpath-31/
菜鳥教程 XPath 參考手冊 - 語法