MENU

C# System.Xml.Serialization.XmlSerializerでXMLをデシリアライズする

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; }
}

このコードでは、以下のような重要なポイントがあります:

  1. Personクラスを定義し、XMLの構造に対応するプロパティを用意します。
  2. XmlSerializerクラスのインスタンスを作成し、デシリアライズ対象の型(この場合はPerson)を指定します。
  3. StringReaderを使用して、XMLデータを読み込みます(実際のアプリケーションでは、多くの場合ファイルから読み込みます)。
  4. 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#クラスの構造の違いを解決しています:

  1. [XmlRoot]属性:ルート要素の名前を指定します。
  2. [XmlAttribute]属性:XML属性をプロパティにマップします。
  3. [XmlElement]属性:要素名が異なる場合にマッピングを指定します。

まとめ

System.Xml.Serialization.XmlSerializerを使用したXMLのデシリアライズには、以下のような利点があります:

  1. 簡単に使用できる:基本的な使用方法が直感的で分かりやすい。
  2. 柔軟性がある:属性を使用してXMLとC#クラスの構造の違いを吸収できる。
  3. 型安全性:デシリアライズ結果が強く型付けされたオブジェクトになる。

XMLのデシリアライズは、設定ファイルの読み込み、Web APIからのデータ取得、データ交換など、様々なシナリオで活用できます。この技術を習得することで、XMLデータを効率的に扱えるようになり、より柔軟なアプリケーション開発が可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次