[C#] XMLをXPathを利用してデータを取得する方法


Devlopment note / C#    作成日付 : 2020/04/16 00:47:17   修正日付 : 2020/04/16 00:47:17

こんにちは。明月です。


この投稿はC#でXMLをXPathを利用してデータを取得する方法に関する説明です。


以前、XMLをCssSelectorエンジン(Sizzle)みたいに要素を検索してデータを取得する方法に関して説明したことがあります。

link - [C#] NSoupライブラリを利用してXMLとHTMLをパーシングする方法


最近はXPathを利用して検索することよりNSoupのライブラリを利用してデータを取得することが一般的なことになりました。でも、Sizzleエンジンの要素を検索する方法の以前はXPathで検索することが一般的だったんです。

でも、XPathの方法が悪いことではなく、Css Selectorで検索するキーが単純だし、理解しやすいのでよく使うことです。でも以前の方法がもっとよい時があります。


例えば、XMLから一つのデータとノードを検索することではNSoupのほうがいいです。でも、XMLの全体を構造化するしクラスを変換することではReaderを利用するかもっと明確なルールを決めて検索することならXPathがよいです。

Stringで正規表現でReplaceするか、ただ特定文字でReplaceするかの差と似てます。


実はXPathを使うためにはXPathを詳しく知らなければならないですが、いつかXPathは別途で説明します。


XPathを使うために以前で使った私のブログの検索エンジンに登録するようなRSSファイルを使いましょう。


link - https://www.nowonbun.com/rss


XPathを利用するクラスのNSoupみたいにオープンソースではなく、System.XMLの.Net Frameworkを使います。

using System;
// XmlDocumentを使うためのNamespace
using System.Xml;
namespace Example
{
  class Program
  {
    // 実行関数
    static void Main(string[] args)
    {
      // XmlDocumentを宣言
      XmlDocument xmlDoc = new XmlDocument();
      // rssを取得する。 urlアドレスならHttpの通信で取得する。ローカルディレクトならローカルで取得する。
      xmlDoc.Load("https://www.nowonbun.com/rss");
      // rssタグの下の channelタグの下の itemタグを選択
      XmlNodeList itemNodes = xmlDoc.SelectNodes("//rss/channel/item");
      // そのタグを複数なので繰り返しで探索する。
      foreach (XmlNode itemNode in itemNodes)
      {
        // itemタグの下でtitleタグを選択
        XmlNode titleNode = itemNode.SelectSingleNode("title");
        // タグの値をコンソールに出力
        Console.WriteLine(titleNode.InnerText);
        // itemタグの下でdescriptionタグを選択
        titleNode = itemNode.SelectSingleNode("description");
        // Hello worldで書き直す。
        titleNode.InnerText = "Hello world";
      }
      // ファイルで格納する。
      xmlDoc.Save("c://work//rss.xml");
      
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}


コンソールの結果をみればrssのtitleのタグの内容だけ出力したことを確認できます。


後、descriptionのタグのテキストデータを変更して、ファイルに格納しました。


結果を確認すればdescriptionタグの内容が変更されたことを確認できます。


NSoupとSystem.Xmlの差はNSoupの場合はHtmlまで検索ができます。でも、System.Xmlの場合はHtmlファイルが検索ができません。


Htmlを読み込めば許せないアトリビュートや開き閉めタグタイプではないこと(inputタグ)などでエラーが発生します。

個人的にはほぼNSoupを使いますが、逆に環境ファイルのXMLの場合は厳しい構造を要求するので逆にSystem.Xmlをよく使います。


ここまでC#でXMLをXPathを利用してデータを取得する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿