C# で XML をオブジェクトにデシリアライズする

Abdullahi Salawudeen 2023年12月11日
  1. 手動で入力したクラスを使用して、XML ファイルを C# オブジェクトに逆シリアル化する
  2. Visual Studio の Paste Special 機能を使用して、Xml を C# オブジェクトに逆シリアル化する
  3. XSD ツールを使用して XML を C# オブジェクトに逆シリアル化する
C# で XML をオブジェクトにデシリアライズする

この記事では、XML ファイルの C# オブジェクトへの変換または逆シリアル化について説明します。

手動で入力したクラスを使用して、XML ファイルを C# オブジェクトに逆シリアル化する

  • C# は、属性およびメソッドとともに、クラスおよびオブジェクトに関連付けられています。
  • オブジェクトは、ジョンジェームスなどのプログラムでクラスで表されます。
  • 属性は、車の色製造年人の年齢、または建物の色などのオブジェクトの特性です。
  • XML は、XML ファイルの送信媒体に関係なく、XML データを解析できるようにする標準化された形式です。

詳細については、このリファレンスを参照してください。

以下は、C# オブジェクトに変換される XML コードサンプルです。

1. <?xml version="1.0" encoding="utf-8"?>
2. <Company xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="https://www.w3.org/2001/XMLSchema">
3.  <Employee name="x" age="30" />
4.  <Employee name="y" age="32" />
5. </Company>

同様の構造を持つクラスは、XML コードサンプルを変換するために C# で作成されます。

using System.Xml.Serialization;

[XmlRoot(ElementName = "Company")]
public class Company

{
  public Company() {
    Employees = new List<Employee>();
  }

  [XmlElement(ElementName = "Employee")]
  public List<Employee> Employees { get; set; }

  public Employee this[string name] {
    get {
      return Employees.FirstOrDefault(
          s => string.Equals(s.Name, name, StringComparison.OrdinalIgnoreCase));
    }
  }
}

public class Employee {
  [XmlAttribute("name")]
  public string Name { get; set; }

  [XmlAttribute("age")]
  public string Age { get; set; }
}

XML オブジェクトを C# に変換する最後のステップは、System.Xml.Serialization.XmlSerializer 関数を使用してオブジェクトをシリアル化することです。

public T DeserializeToObject<T>(string filepath)
    where T : class {
  System.Xml.Serialization.XmlSerializer ser =
      new System.Xml.Serialization.XmlSerializer(typeof(T));

  using (StreamReader sr = new StreamReader(filepath)) {
    return (T)ser.Deserialize(sr);
  }
}

Visual Studio の Paste Special 機能を使用して、Xml を C# オブジェクトに逆シリアル化する

この方法では、Microsoft Visual Studio 2012 以降と.NetFramework4.5 以降を使用する必要があります。VisualStudio の WCF ワークロードもインストールする必要があります。

  • XML ドキュメントの内容をクリップボードにコピーする必要があります。
  • プロジェクトソリューションに新しい空のクラスを追加します。
  • 新しいクラスファイルを開きます。
  • IDE のメニューバーにある[編集]ボタンをクリックします。
  • ドロップダウンから Paste Special を選択します。
  • [XML をクラスとして貼り付け]をクリックします。

XML をクラスとして貼り付ける

Visual Studio によって生成されたクラスを使用するには、Helpers クラスを作成します。

using System;
using System.IO;
using System.Web.Script.Serialization;  // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;

namespace Helpers {
  internal static class ParseHelpers

  {
    private static JavaScriptSerializer json;
    private static JavaScriptSerializer JSON {
      get { return json ?? (json = new JavaScriptSerializer()); }
    }

    public static Stream ToStream(this string @this) {
      var stream = new MemoryStream();
      var writer = new StreamWriter(stream);
      writer.Write(@this);
      writer.Flush();
      stream.Position = 0;
      return stream;
    }

    public static T ParseXML<T>(this string @this)
        where T : class {
      var reader = XmlReader.Create(
          @this.Trim().ToStream(),
          new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
      return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
    }

    public static T ParseJSON<T>(this string @this)
        where T : class {
      return JSON.Deserialize<T>(@this.Trim());
    }
  }
}

XSD ツールを使用して XML を C# オブジェクトに逆シリアル化する

XSD は、XML ファイルまたはドキュメントで定義されたスキーマと同等の classes または objects を自動的に生成するために使用されます。

XSD.exe は通常、次のパスにあります:C:\Program Files (x86)\Microsoft SDKs\Windows\{version}\bin\NETFX {version} Tools\。さらに詳しい説明は[この資料](https://learn.microsoft.com/en-us/dotnet/standard/serialization/xml-schema-def-tool-gen#:~:text=The%20XML%20Schema%20Definition%20tool%20 (Xsd.exe/)%20allows%20you,defined%20by%20an%XML%20schema.) にあります.

XML ファイルが次のパスに保存されているとします:C:\X\test.XML

以下は、XML を C# クラスに自動的に逆シリアル化するための手順です。

  • 検索バーに開発者コマンドプロンプトと入力し、クリックして開きます。
  • cd C:\X と入力して、XML ファイルパスに移動します。
  • XML ファイルの行番号と不要な文字を削除します。
  • xsd test.XML と入力して、test.XML から同等の XSD ファイルを作成します。
  • test.XSD ファイルが同じファイルパスに作成されます。
  • XSD /c test.XSD と入力して、XML ファイルと同等の C# クラスを作成します。
  • test.cs ファイルが作成されます。これは、XML ファイルの正確なスキーマを持つ C# クラスです。

出力:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.42000
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System.Xml.Serialization;

//
// This source code was auto-generated by xsd, Version=4.8.3928.0.
//

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Company {

    private CompanyEmployee[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Employee", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public CompanyEmployee[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
public partial class CompanyEmployee {

    private string nameField;

    private string ageField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string name {
        get {
            return this.nameField;
        }
        set {
            this.nameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string age {
        get {
            return this.ageField;
        }
        set {
            this.ageField = value;
        }
    }
}
Abdullahi Salawudeen avatar Abdullahi Salawudeen avatar

Abdullahi is a full-stack developer and technical writer with over 5 years of experience designing and implementing enterprise applications. He loves taking on new challenges and believes conceptual programming theories should be implemented in reality.

LinkedIn GitHub

関連記事 - Csharp Object