XML zu Objekt deserialisieren in C#
- Verwenden Sie manuell typisierte Klassen, um eine XML-Datei in ein C#-Objekt zu deserialisieren
-
Verwenden Sie die Funktion
Paste Specialvon Visual Studio, umXmlin ein C#-Objekt zu deserialisieren -
Verwenden Sie das
XSD tool, umXMLin ein C#-Objekt zu deserialisieren
Dieser Artikel demonstriert die Konvertierung oder Deserialisierung von XML-Dateien in das C#-Objekt.
Verwenden Sie manuell typisierte Klassen, um eine XML-Datei in ein C#-Objekt zu deserialisieren
- C# wird mit
KlassenundObjektenzusammen mitAttributenundMethodenassoziiert. Objektewerden programmatisch mit Klassen dargestellt, wieJohnoderJames.Attributesind Eigenschaften von Objekten wieFarbe eines Autos,Baujahr,Alter einer PersonoderFarbe eines Gebäudes.XMList das standardisierte Format, das es ermöglicht,XML-Daten unabhängig vom Übertragungsmedium derXML-Datei zu analysieren.
Weitere Diskussionen sind über diese Referenz verfügbar.
Unten ist ein XML-Codebeispiel, das in ein C#-Objekt konvertiert würde.
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>
Eine Klasse mit einer ähnlichen Struktur würde in C# erstellt werden, um das XML-Codebeispiel zu konvertieren.
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; }
}
Der letzte Schritt zum Konvertieren des XML-Objekts in C# besteht darin, die Funktion System.Xml.Serialization.XmlSerializer zu verwenden, um das Objekt zu serialisieren.
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);
}
}
Verwenden Sie die Funktion Paste Special von Visual Studio, um Xml in ein C#-Objekt zu deserialisieren
Diese Methode erfordert die Verwendung von Microsoft Visual Studio 2012 und höher mit .Net Framework 4.5 und höher. Die WCF-Workload für Visual Studio muss ebenfalls installiert sein.
- Der Inhalt des
XML-Dokuments muss in die Zwischenablage kopiert werden. - Fügen Sie der Projektlösung eine neue
emptyKlasse hinzu. - Öffnen Sie die neue Klassendatei.
- Klicken Sie in der Menüleiste der IDE auf die Schaltfläche
Bearbeiten. - Wählen Sie im Dropdown-Menü
Paste Special. - Klicken Sie auf XML als Klassen einfügen.

Um die von Visual Studio generierte Klasse zu verwenden, erstellen Sie die Klasse 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());
}
}
}
Verwenden Sie das XSD tool, um XML in ein C#-Objekt zu deserialisieren
XSD wird verwendet, um automatisch Klassen oder Objekte zu generieren, die dem Schema entsprechen, das in einer XML-Datei oder einem XML-Dokument definiert ist.
XSD.exe befindet sich normalerweise im Pfad: C:\Program Files (x86)\Microsoft SDKs\Windows\{version}\bin\NETFX {version} Tools\. Weitere Diskussionen finden Sie über diese Referenz.
Angenommen, die XML-Datei wird in diesem Pfad gespeichert: C:\X\test.XML.
Im Folgenden sind die Schritte aufgeführt, die ausgeführt werden müssen, um die XML-Klassen automatisch in C#-Klassen zu deserialisieren:
- Geben Sie
Entwickler-Eingabeaufforderungin die Suchleiste ein und klicken Sie darauf, um sie zu öffnen. - Geben Sie
cd C:\Xein, um zum DateipfadXMLzu navigieren. - Zeilennummern und unnötige Zeichen in der
XML-Datei entfernen. - Geben Sie
xsd test.XMLein, um eineXSD-Dateizu erstellen, die der test.XML entspricht. - Eine
test.XSD-Datei wird im selben Dateipfad erstellt. - Geben Sie
XSD /c test.XSDein, um dieC#-Klassenzu erstellen, die derXML-Datei entsprechen. - Eine
test.cs-Datei wird erstellt, eine C#-Klasse mit einem exakten Schema derXML-Datei.
Ausgabe:
//------------------------------------------------------------------------------
// <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;
}
}
}
