2020-01-22

特定の要素配下のテキストノード文字列を要素ごとにすべて取得する方法(Html Agility Pack)

Html Agility Packで取得したノードに対して、要素配下にあるテキストノード文字列(子要素のテキストノード含む)をまとめて取得、または要素ごとに別々で取得する方法です。

結果としてはまとめて取得するので問題なかったのですが、別々で取得する方法を見つけて、こんな方法もあるのかと思ったのでメモとして残しておきます。

目次

  • 対象のHTML
  • テキストノードの文字列をまとめて取得
  • テキストノードの文字列を要素ごとに別々で取得

対象のHTML

Html Agility Packで読み取るHTMLは以下の通りとします。


<div>
  <h3>タイトル<a href="#">リンク<<a><h3>
</div>

テキストノードの文字列をまとめて取得

Html Agility Packで対象となる要素のテキストノードの文字列をまとめて取得する場合は、以下のように、親要素のInnerTextで取得できます。


var titleNode = doc.DocumentNode.SelectSingleNode("//h3");
if (titleNode != null)
{
  Console.WriteLine(titleNode.InnerText);
}

実行結果は以下の通り。

タイトルリンク

テキストノードの文字列を要素ごとに別々で取得

今度は要素ごとに別々で取得する方法です。


var titleNode = doc.DocumentNode.SelectSingleNode("//h3");
if (titleNode != null)
{
  foreach (var node in titleNode.SelectNodes(".//text()"))
  {
    Console.WriteLine(node.InnerText);
  }
}

上記のコードの実行結果は以下の通り。

タイトル
リンク

通常はまとめて取得して問題ないですが、場合によっては要素ごとに処理する必要があるかと思います。

C#】関連記事