C# で XML をオブジェクトにデシリアライズする
- 手動で入力したクラスを使用して、XML ファイルを C# オブジェクトに逆シリアル化する
-
Visual Studio の
Paste Special
機能を使用して、Xml
を C# オブジェクトに逆シリアル化する -
XSD ツール
を使用してXML
を C# オブジェクトに逆シリアル化する
この記事では、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 をクラスとして貼り付け]をクリックします。
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;
}
}
}