XPath

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ではない)
@要素の属性にマッチ
サンプルコード解説
  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]
    最後から2番目のWebInfoノードを取得 → google
  5. /WebInfos/WebInfo[position()<3]
    position()でノード番号を取得;番号が3未満のノードを選択 → 先頭2件(FoxDevelop、google)
  6. //IP[@type='ipv4']
    //で全体検索;属性typeipv4<IP>ノードを抽出
  7. //@type
    文書内のtypeという名前の属性をすべて取得
  8. //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

Previous:
Next:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です