1. XPathとは何か
XPath(XML Path Language)はXML向けのパス言語です。役割:
パス式を使ってXML/HTMLドキュメント内のノード、ノードテキスト、ノード属性を照会し、条件によるフィルタリングも行えます。
ポイント:HtmlAgilityPackはHTML文書をXML DOMのように扱えるため、XPathでウェブページのデータを抽出可能です。
2. サンプル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)
3. 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]
最後から2番目のWebInfoノードを取得 → google/WebInfos/WebInfo[position()<3]position()でノード番号を取得;番号が3未満のノードを選択 → 先頭2件(FoxDevelop、google)//IP[@type='ipv4']//で全体検索;属性typeがipv4の<IP>ノードを抽出//@type
文書内のtypeという名前の属性をすべて取得//WebInfo
階層に関わらず文書内のすべての<WebInfo>ノードを検索
4. よく使う応用記述
//Name/text() # Nameタグ内のテキストを取得
//WebInfo[Name="FoxDevelop"] # テキスト内容でノードを照合
//IP/@type # IPタグのtype属性の値を読み取るCode language: JSON / JSON with Comments (json)
5. 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