XPath 是 XML 的查詢語言,地位相當於資料庫的 SQL。掌握 XPath,即可精準定位 XML 文件中任意節點與值。本文以實例詳解核心語法。
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<cd country="USA">
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<price>10.90</price>
</cd>
<cd country="UK">
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<price>9.90</price>
</cd>
<cd country="USA">
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<price>9.90</price>
</cd>
</catalog>
| 語法 | 說明 | 範例結果 |
|---|---|---|
/catalog/cd/price | 絕對路徑:catalog 下所有 cd 的 price | 3 個 price 節點 |
//cd | 任意層級所有 cd 節點 | 3 個 cd 節點 |
/catalog/cd/* | cd 所有子元素 | title, artist, price |
/catalog/*/price | catalog 孫輩中名為 price 的節點 | 3 個 price |
/*/*/price | 任意兩層父節點下的 price | 同上 |
//* | 文件中所有元素 | 所有節點 |
關鍵規則:/ 絕對路徑,// 任意層級,* 僅代表未知名稱,不代表未知層級。
/catalog/cd[1] // 第一個 cd (XPath 索引從 1 開始)
/catalog/cd[last()] // 最後一個 cd
/catalog/cd[price] // 含 price 子元素的 cd
/catalog/cd[price=10.90] // price 值等於 10.90 的 cd
/catalog/cd[price=10.90]/price // 符合條件 cd 下的 price 節點
/catalog/cd/title | /catalog/cd/artist
//title | //artist | //price
//@country // 所有 country 屬性
//cd[@country] // 擁有 country 屬性的 cd
//cd[@*] // 擁有任意屬性的 cd
//cd[@country='UK'] // country='UK' 的 cd
XmlDocument doc = new XmlDocument();
doc.Load("catalog.xml");
XmlNodeList prices = doc.SelectNodes("/catalog/cd/price");
foreach (XmlNode n in prices) Console.WriteLine(n.InnerText);
XmlNode ukCd = doc.SelectSingleNode("//cd[@country='UK']");
Console.WriteLine(ukCd.SelectSingleNode("title").InnerText);
XPath 語法簡潔強大,掌握路徑、萬用字元、索引、條件、聯集、屬性六大類語法,即可應對絕大多數 XML 查詢需求。配合 C# SelectNodes/SelectSingleNode,開發效率大幅提升。