XMLは構造化されたデータを表現する一般的な形式であり、C#アプリケーションでXMLデータを扱う機会は多いでしょう。特に、XMLからC#オブジェクトへの変換(デシリアライズ)は重要なタスクの一つです。この記事では、System.Xml.Serialization.XmlSerializer
クラスを使用してXMLをC#オブジェクトにデシリアライズする方法を、初心者にも分かりやすく解説します。
目次
XmlSerializerを使用したデシリアライズの基本
XmlSerializer
クラスを使用すると、XMLデータを簡単にC#オブジェクトに変換できます。以下に、基本的な使用例を示します。
using System;
using System.Xml.Serialization;
using System.IO;
public class Program
{
public static void Main()
{
// XMLデータ(通常はファイルから読み込みます)
string xmlData = @"
<Person>
<Name>山田太郎</Name>
<Age>30</Age>
<Email>yamada@example.com</Email>
</Person>";
// XmlSerializerオブジェクトを作成
XmlSerializer serializer = new XmlSerializer(typeof(Person));
// XMLからオブジェクトにデシリアライズ
using (StringReader reader = new StringReader(xmlData))
{
Person person = (Person)serializer.Deserialize(reader);
// デシリアライズされたオブジェクトの内容を表示
Console.WriteLine($"名前: {person.Name}");
Console.WriteLine($"年齢: {person.Age}");
Console.WriteLine($"メール: {person.Email}");
}
}
}
// デシリアライズ対象のクラス
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
このコードでは、以下のような重要なポイントがあります:
Person
クラスを定義し、XMLの構造に対応するプロパティを用意します。XmlSerializer
クラスのインスタンスを作成し、デシリアライズ対象の型(この場合はPerson
)を指定します。StringReader
を使用して、XMLデータを読み込みます(実際のアプリケーションでは、多くの場合ファイルから読み込みます)。serializer.Deserialize
メソッドを呼び出してデシリアライズを行い、結果を適切な型にキャストします。
XMLファイルからのデシリアライズ
実際のアプリケーションでは、XMLデータをファイルから読み込むことが多いでしょう。以下に、XMLファイルからデシリアライズする例を示します。
using System;
using System.Xml.Serialization;
using System.IO;
public class Program
{
public static void Main()
{
XmlSerializer serializer = new XmlSerializer(typeof(Product));
// XMLファイルからデシリアライズ
using (FileStream fileStream = new FileStream("product.xml", FileMode.Open))
{
Product product = (Product)serializer.Deserialize(fileStream);
Console.WriteLine($"商品コード: {product.Code}");
Console.WriteLine($"商品名: {product.Name}");
Console.WriteLine($"価格: {product.Price}円");
}
}
}
public class Product
{
public string Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
このコードでは、FileStream
を使用してXMLファイルを直接読み込み、デシリアライズしています。
デシリアライズのカスタマイズ
XMLの構造がC#クラスの構造と完全に一致しない場合、属性を使用してマッピングをカスタマイズできます。以下に例を示します。
using System;
using System.Xml.Serialization;
using System.IO;
public class Program
{
public static void Main()
{
string xmlData = @"
<EmployeeInfo EmployeeId='1001'>
<FullName>鈴木花子</FullName>
<Department>営業部</Department>
<StartDate>2020-04-01</StartDate>
</EmployeeInfo>";
XmlSerializer serializer = new XmlSerializer(typeof(Employee));
using (StringReader reader = new StringReader(xmlData))
{
Employee employee = (Employee)serializer.Deserialize(reader);
Console.WriteLine($"ID: {employee.Id}");
Console.WriteLine($"名前: {employee.Name}");
Console.WriteLine($"部署: {employee.Department}");
Console.WriteLine($"入社日: {employee.JoinDate.ToShortDateString()}");
}
}
}
[XmlRoot("EmployeeInfo")]
public class Employee
{
[XmlAttribute("EmployeeId")]
public int Id { get; set; }
[XmlElement("FullName")]
public string Name { get; set; }
public string Department { get; set; }
[XmlElement("StartDate")]
public DateTime JoinDate { get; set; }
}
このコードでは、以下のような属性を使用してXMLとC#クラスの構造の違いを解決しています:
[XmlRoot]
属性:ルート要素の名前を指定します。[XmlAttribute]
属性:XML属性をプロパティにマップします。[XmlElement]
属性:要素名が異なる場合にマッピングを指定します。
まとめ
System.Xml.Serialization.XmlSerializer
を使用したXMLのデシリアライズには、以下のような利点があります:
- 簡単に使用できる:基本的な使用方法が直感的で分かりやすい。
- 柔軟性がある:属性を使用してXMLとC#クラスの構造の違いを吸収できる。
- 型安全性:デシリアライズ結果が強く型付けされたオブジェクトになる。
XMLのデシリアライズは、設定ファイルの読み込み、Web APIからのデータ取得、データ交換など、様々なシナリオで活用できます。この技術を習得することで、XMLデータを効率的に扱えるようになり、より柔軟なアプリケーション開発が可能になります。
コメント