C# で XML を手軽に読み込み

過去の記事「XML のすすめ」では、膨大な Excel のテーブルを XML に置き換えることのメリットについてお話ししました。ここで決め手となるのが、C# です。

今回は、C# で XML を読み込むコードがいかにシンプルかということをお見せします。

XML の例

Excel で表現された、次のような仕様書があったとします。


これを素直に XML に置き換えるなら、たとえば次のような表現になるでしょう。

今回は、この XML を例にとって C# のコードを紹介していきます。

C# のコード

XML の取り扱いは、XDocument というクラスを使うのが最適です。コードの冒頭に、次の using 宣言を追加しておいてください。

.NET Framework には他にも XMLDocument や XMLReader といったクラスがありますが、後発の XDocument の使いやすさは断トツです。名前が似ていてややこしいので、ここは注意してください。

XML を読むのに必要なのは、次に挙げる5つの操作だけです。

1. XML をロードする

特定の XML ファイルをロードするコードは、こうです。

以降はこのインスタンスに対する操作が、XML に対する操作になります。面倒なファイルのオープン・クローズは要りません。

2. テーブルを読み込む

今回の例では、ルートに存在するテーブルの名前は「価格表」です。まずはこれを丸ごと読み込んでしまいましょう。そのコードがこちらです。

XElement とはその名の通り XML の一要素を表します。

3. 要素を読み込む

XML が再帰的な構造を持つのと同様、XElement クラスも再帰的な構造を持ちます。つまり、XElement のインスタンスから、その子要素である XElement が取り出せるのです。

ここで、「価格表」テーブルにぶら下がっている「データ」要素は複数ありますから、まずはこれらを複数のまま取り出します。

メソッド名が Elements と複数形になっている点に注意してください。これで、「データ」要素を並べたものが取り出せました。ということは、foreach 文を使うことで要素の数だけ回るループを書くことができます。

4. 値を取り出す

要素に付随する値そのもの、つまり今回の例でいう “りんご” や “120” の部分を取り出すには、XElement の Value というプロパティを使います。

5. 属性を取り出す

今回の例では、「商品」要素に「言語」という属性が付いています。これを取り出すには Attribute というメソッドを使います。

属性の右辺、すなわち “日本語” や “英語” に相当する部分は、このインスタンスの Value というプロパティに収められています。

まとめ

たったこれだけです。XDocument クラスが XML の面倒な部分を全部引き受けてくれていることがわかりますね。

これまでのコードを応用して一つにしたものを載せておきます。

XML の構造が複雑になるほど、このコードの構造も複雑になっていきますが、これらの操作の組み合わせであるという点は変わりません。

もう少し変わったことがやりたい場合は別のメソッドやプロパティが必要になりますが、Visual Studio に備わっているインテリセンスを駆使すれば何とかなってしまいます。ぜひ、試してみてください。

ソフトウェアの設計・実装がうまく行かなくてお困りではありませんか? 組込屋にお任せください。リモート案件は、常駐の半額でお受けしています。

3 Replies to “C# で XML を手軽に読み込み”

  1. var table = XDocument.Load(@”C:\test.xml”).Element(“価格表”);
    の実行時にエラー(『指定されたエンコードに無効な文字があります。 行 2、位置 2。』)になってしままいます、
    漢字が良くないようです(>_<) 対処方法はありますか?
    漢字を読み込むためのオプションとか何かありますでしょうか?

  2. 申し訳ありません
    すみません先ほどのコメントは無視してください

    UTF8に変換したファイルを扱っていたつもりでしたが
    手違いでS-JISのままでした

    UTF-8に変換されたファイルを扱う事により
    思ったように機能してくれました

    本当に申し分けありませんでした m(_ _)m

    1. 訂正のコメントまでいただき、ありがとうございます。こういったコメントは後から来た人たちに向けての補足情報になるので助かります。

      他にも不明な点などありましたらいつでもお尋ねください。これからも組込屋のブログをよろしくお願いします。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)