一、什麼是XPath
XPath(XML Path Language)即XML路徑語言,用途:
透過路徑運算式,查詢XML/HTML文件裡的節點、節點文字、節點屬性,同時支援條件過濾。
重點:HtmlAgilityPack可以把HTML文件轉換成XML DOM結構,因此能夠直接使用XPath擷取網頁內容。
二、XML參考範例
<?xml version="1.0" encoding="utf-8"?>
<WebInfos>
<WebInfo>
<Name>FoxDevelop</Name>
<Domain>https://foxdevelop.com</Domain>
<IP type="ipv4">127.0.0.1</IP>
<Age>1</Age>
</WebInfo>
<WebInfo>
<Name>google</Name>
<Domain>https://www.google.com</Domain>
<IP type="ipv4">95.0.0.1</IP>
<Age>23</Age>
</WebInfo>
<WebInfo>
<Name>microsoft</Name>
<Domain>https://www.microsoft.com</Domain>
<IP type="ipv4">192.186.0.1</IP>
<Age>13</Age>
</WebInfo>
</WebInfos>Code language: HTML, XML (xml)
三、XPath語法詳解
基礎符號說明
| 符號 | 含義 |
|---|---|
/ | 從根節點開始搜尋;做為階層分隔符 |
// | 在文件任意位置搜尋,不受階層限制 |
[] | 設定篩選條件、索引,索引由1開始(不是0) |
@ | 比對標籤屬性 |
範例逐項解說
/WebInfos
從根節點取出頂層節點<WebInfos>/WebInfos/WebInfo[1]
取得第1個<WebInfo>節點 → FoxDevelop資料
⚠️ XPath索引從1算起
/WebInfos/WebInfo[Age>5]
篩選子節點<Age>數值大於5的WebInfo節點
符合結果:google(23)、microsoft(13)/WebInfos/WebInfo[Age>5]/Name
在前一條篩選結果基礎上,取出子節點<Name>/WebInfos/WebInfo[last()]last()函式:取得最後一個WebInfo → microsoft/WebInfos/WebInfo[last()-1]
取得倒數第二個WebInfo → google/WebInfos/WebInfo[position()<3]position()取得當前節點序號;匹配序號小於3 → 前兩筆(FoxDevelop、google)//IP[@type='ipv4']//全域搜尋;篩選屬性type等於ipv4的<IP>節點//@type
取出文件內所有名為type的屬性//WebInfo
全域搜尋文件中全部<WebInfo>節點,不受巢狀層級影響
四、實用擴充寫法
//Name/text() # 讀取Name標籤內的文字
//WebInfo[Name="FoxDevelop"] # 依據文字內容匹配節點
//IP/@type # 取得IP標籤type屬性的值Code language: JSON / JSON with Comments (json)
五、於HtmlAgilityPack當中使用
var doc = new HtmlDocument();
doc.Load("demo.xml");
// 篩選Age>5的網站名稱
var nodes = doc.DocumentNode.SelectNodes(@"/WebInfos/WebInfo[Age>5]/Name");
foreach(var node in nodes)
{
Console.WriteLine(node.InnerText);
}Code language: PHP (php)
XPath