XPath

一、什麼是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)
@比對標籤屬性
範例逐項解說
  1. /WebInfos
    從根節點取出頂層節點 <WebInfos>
  2. /WebInfos/WebInfo[1]
    取得第1個<WebInfo>節點 → FoxDevelop資料

⚠️ XPath索引從1算起

  1. /WebInfos/WebInfo[Age>5]
    篩選子節點<Age>數值大於5的WebInfo節點
    符合結果:google(23)、microsoft(13)
  2. /WebInfos/WebInfo[Age>5]/Name
    在前一條篩選結果基礎上,取出子節點<Name>
  3. /WebInfos/WebInfo[last()]
    last()函式:取得最後一個WebInfo → microsoft
  4. /WebInfos/WebInfo[last()-1]
    取得倒數第二個WebInfo → google
  5. /WebInfos/WebInfo[position()<3]
    position()取得當前節點序號;匹配序號小於3 → 前兩筆(FoxDevelop、google)
  6. //IP[@type='ipv4']
    //全域搜尋;篩選屬性type等於ipv4<IP>節點
  7. //@type
    取出文件內所有名為type的屬性
  8. //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

Previous:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *