【C#】XMLの読み込み方法いろいろまとめてみた

この記事は、 KENTEM TechBlog アドベントカレンダー2023 10日目、12月14日の記事です。

こんにちは。第2開発部のN.Yです。

最近、C#でXMLに記載されている情報を取得したい機会があり、調べたところXML読み込みには色々な方法があることが分かりました。
今回は、調査の中で出てきたXMLの読み込み方法についてご紹介します。

XMLについて

XMLとは?

XMLは Extensible Markup Language の略で、マークアップ言語のひとつです。
HTMLでは定められたタグしか使用できませんが、XMLでは制作者が独自のタグを定義して利用することができます。
これにより、文書中のデータの意味などを定義し付加することが可能となりました。
次は簡単なXMLの例です。

<商品名>快測ナビ</商品名>

タグを読めば、何のデータが書いてあるのかすぐに分かりますよね。
タグに囲まれる部分は要素と呼ばれていて、<要素名>要素の内容</要素名>の形をとります。
この要素名の部分を、制作者は自由に決めることができます。

XMLの使われどころ

XMLは、W3C(World Wide Web Consortium)という団体が策定した国際標準規格に統一された記述方式で書かれており、さまざまなシステムで使用可能となっています。
そのため、異なるアプリケーション同士のデータ連携や、データの管理のために使用される機会が多いです。

XMLを読込む方法

C#でXMLを読み込む方法は沢山ある

"XML 読み込み C#"などで検索すると、軽く調べただけでも「XmlDocument」「XDocument」「XmlReader」「XPath」「XmlSerializer」などなど・・・
色々出てきて困ってしまいました。

どれを使えばいいの?

自分が欲しい情報を取得するためには、どの方法を使えばベストなのでしょうか?
今回は、調査の中でも頻繁に出てきた「XmlDocument」「XDocument」「XmlReader」の3つについて 、それぞれの方法の特徴と使いどころをサンプルコードと一緒にまとめてみました。

今回は以下のXMLを使用してサンプルコードを書いてみます。

<?xml version="1.0" encoding="utf-8" ?>
<KENTEM基本情報>
  <事業所一覧>
    <事業所 事業所コード="001">
      <事業所名>本社</事業所名>
      <住所>静岡県富士市石坂312-1</住所>
      <TEL>0570-200-787</TEL>
    </事業所>
    <事業所 事業所コード="002">
      <事業所名>静岡第1オフィス</事業所名>
      <住所>静岡県静岡市葵区呉服町1-30 札の辻クロス6階</住所>
      <TEL>0570-200-787</TEL>
    </事業所>
    <事業所 事業所コード="003">
      <事業所名>静岡第2オフィス</事業所名>
      <住所>静岡県静岡市葵区呉服町 2丁目 1-5 5風来館 8階</住所>
      <TEL>0570-200-787</TEL>
    </事業所>    
  </事業所一覧>
</KENTEM基本情報>

XmlDocument

特徴

  • データをキャッシュするため、最初にドキュメント全体を読み込む必要がある (ファイルサイズが大きい場合は多くのメモリを消費する)
  • キャッシュされたドキュメントは変更可能
  • 簡単にプログラムを記述できる

使いどころ

  • 何度もデータを検索・書き込みしたい

サンプルコード

xmlから静岡第一オフィスの住所を取得しコンソールに表示します。

var xmlPath = @"KENTEM基本情報.xml";
var xmlDoc = new XmlDocument();
xmlDoc.Load(xmlPath);
XmlNode root = xmlDoc.DocumentElement;
foreach (XmlNode childNode in root["事業所一覧"].ChildNodes) {
    if (childNode.Attributes["事業所コード"].Value == "002") {
        var 静岡第一オフィスの住所 = childNode["住所"].InnerText;
        Console.WriteLine(静岡第一オフィスの住所);
        break;
    }
}

実行結果

静岡県静岡市葵区呉服町1-30 札の辻クロス6階

XDocument(LINQ to Xml)

特徴

  • 統合言語クエリ (LINQ)を使用したシンプルな記述が可能
  • データをキャッシュするため、基本的には最初にドキュメント全体を読み込む必要がある (XmlReader と IEnumerable を組み合わせて読み込まずに照会できる方法もあるらしい)
  • XmlDocumentで実施できることのほとんどを軽量に実現

使いどころ

  • 何度もデータを検索・書き込みしたい
  • データを抽出・書き込みする処理をシンプルかつ直感的に書きたい

サンプルコード

xmlから静岡第一オフィスの住所を取得しコンソールに表示します。

var xmlPath = @"KENTEM基本情報.xml";
XDocument doc = XDocument.Load(xmlPath);
var 静岡第一オフィスの住所 = doc.Descendants("事業所")
           .Where(q => q.Attribute("事業所コード").Value == "002")
           .FirstOrDefault()
           .Element("住所").Value;

Console.WriteLine(静岡第一オフィスの住所);

実行結果

静岡県静岡市葵区呉服町1-30 札の辻クロス6階

XmlReader

特徴

  • XMLを先頭から順次読み込む(前の行には戻れない)
  • データをキャッシュしないため高速 (何度もデータ検索したい場合には適さない)
  • 少し複雑なプログラム記述となる

使いどころ

  • 巨大なファイルの処理
  • XMLを単純に解析・変換したい

サンプルコード

XMLの要素と値を取得しコンソールに表示します。

var xmlPath = @"KENTEM基本情報.xml";
using (XmlReader reader = XmlReader.Create(xmlFilePath)) {
    while (reader.Read()) {
        switch (reader.NodeType) {
            case XmlNodeType.Element:
                Console.WriteLine("<{0}>", reader.Name);
                break;
            case XmlNodeType.Text:
                Console.WriteLine(reader.Value);
                break;
            default:
                break;
        }
    }
}

実行結果

<KENTEM基本情報>
<事業所一覧>
<事業所>
<事業所名>
本社
<住所>
静岡県富士市石坂312-1
<TEL>
0570-200-787
<事業所>
<事業所名>
静岡第1オフィス
<住所>
静岡県静岡市葵区呉服町1-30 札の辻クロス6階
<TEL>
0570-200-787
<事業所>
<事業所名>
静岡第2オフィス
<住所>
静岡県静岡市葵区呉服町 2丁目 1-5 5風来館 8階
<TEL>
0570-200-787

まとめ

特別な理由がない限りは、シンプルかつ軽量に処理を記載できるXDocument(LINQ to Xml)を使用することがベストのようです。
XMLの読み込み処理を書きたい方は、よければ参考にしてみてください。

おわりに

KENTEMでは、様々な拠点でエンジニアを大募集しています!
建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。

https://hrmos.co/pages/kentem2211/jobs/A0006hrmos.co

https://hrmos.co/pages/kentem2211/jobs/A0024hrmos.co

https://hrmos.co/pages/kentem2211/jobs/A0008hrmos.co

hrmos.co

https://hrmos.co/pages/kentem2211/jobs/A0025hrmos.co