【C#・LINQ】LINQ to XMLを使ったXMLのデータ操作

.NET Framework 3.5より搭載されたLINQ機能は、多くのC#の開発現場で活用されるようになりました。統一的な手法でデータに問い合わせができる機能で、LINQの種類も豊富です。その中でも、XMLデータに対して処理を行うLINQ to XMLについて、この記事で確認していきたいと思います。
- PG
- LINQ to XMLって積極的に利用していくべき機能なのでしょうか?
- PM
- 確かにC#でXMLに問い合わせする方法はいくつか存在します。しかし、LINQ to XMLを活用して処理を実装することで、より簡潔にソースコードを記述することができますので、利用していくことをおすすめしますね。
LINQ to XMLでできること
.NET Frameworkが提供する統合言語クエリのひとつの機能であるLINQ to XMLは、その名のとおりXMLファイルに対して問い合わせを行うことが可能です。
LINQ to XMLを使用することで、検索条件などを指定してXMLファイルの要素からデータの抽出を行うことができますし、C#で編集したデータをXMLファイルに出力することもできます。データベースに問い合わせるのと同様の手法でXMLファイルとやり取りできることは、開発者にとってありがたい機能であるといえるでしょう。
C#でLINQ to XMLを使ってデータの抽出サンプルコード
ここでは実際に、LINQ to XMLを利用してXMLファイルへの問い合わせを行うコーディングのサンプルを紹介します。今回の開発環境には、Visual Studio Community 2017を使用します。
C#でLINQ to XMLを利用するには、System.Xml.Linqをusingする必要があります。これを忘れてしまうと、いつまでたってもコンパイルエラーになりますので注意しましょう。
XMLファイルからデータの抽出を行うので、まずは使用するXMLファイルを作成します。
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <JAPAN> <Tokyo> <No>1</No> <Ku>Sibuya</Ku> </Tokyo> </JAPAN> |
次に実際にLINQ to XMLを利用して、上記で作成したテストXMLファイルの要素を抽出します。ここでは、Descendantsメソッドを利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Data; using System.Linq; using System.Xml.Linq; using System.Windows.Forms; namespace WindowsFormsApp14 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var XFILE = @"C:\XML_INPUT\sample.xml"; var xdoc = XDocument.Load(XFILE); var city = (from x in xdoc.Descendants("Tokyo") where x.Element("No").Value == "1" select x).Single(); label1.Text = city.Element("Ku").Value; } } } |
実行画面
ボタン押下で、ラベルに「Sibuya」を表示させます。
実行結果
- PG
- 「LINQ to XML」っていうくらいですから、もっと難しいかと思っていましたが、簡単にコーディングできるのですね。
- PM
- そうですね。LINQは慣れるまで多少の時間が必要かもしれません。しかし、慣れると本当に使い勝手の良い機能です。統一的な手法でデータベースやXMLに問い合わせすることができますので、ソースも簡潔にまとめることが可能です。早めに使い方を理解することをおすすめします。
C#を使用するならLINQ機能の知識も定着させよう
XMLデータは多くの現場で利用されています。データベースを活用するまでもないデータなどはXMLで扱うこともあります。データベース、XMLにとらわれずにデータの抽出を行えるLINQ機能は、ますますこれからも活用されていくでしょうから、この機会に知識として定着させていきましょう。