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 Special
von Visual Studio, umXml
in ein C#-Objekt zu deserialisieren -
Verwenden Sie das
XSD tool
, umXML
in 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
Klassen
undObjekten
zusammen mitAttributen
undMethoden
assoziiert. Objekte
werden programmatisch mit Klassen dargestellt, wieJohn
oderJames
.Attribute
sind Eigenschaften von Objekten wieFarbe eines Autos
,Baujahr
,Alter einer Person
oderFarbe eines Gebäudes
.XML
ist 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
empty
Klasse 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-Eingabeaufforderung
in die Suchleiste ein und klicken Sie darauf, um sie zu öffnen. - Geben Sie
cd C:\X
ein, um zum DateipfadXML
zu navigieren. - Zeilennummern und unnötige Zeichen in der
XML
-Datei entfernen. - Geben Sie
xsd test.XML
ein, um eineXSD-Datei
zu erstellen, die der test.XML entspricht. - Eine
test.XSD
-Datei wird im selben Dateipfad erstellt. - Geben Sie
XSD /c test.XSD
ein, um dieC#-Klassen
zu 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;
}
}
}