XML zu Objekt deserialisieren in C#

Abdullahi Salawudeen 15 Februar 2024
  1. Verwenden Sie manuell typisierte Klassen, um eine XML-Datei in ein C#-Objekt zu deserialisieren
  2. Verwenden Sie die Funktion Paste Special von Visual Studio, um Xml in ein C#-Objekt zu deserialisieren
  3. Verwenden Sie das XSD tool, um XML in ein C#-Objekt zu deserialisieren
XML zu Objekt deserialisieren in C#

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 und Objekten zusammen mit Attributen und Methoden assoziiert.
  • Objekte werden programmatisch mit Klassen dargestellt, wie John oder James.
  • Attribute sind Eigenschaften von Objekten wie Farbe eines Autos, Baujahr, Alter einer Person oder Farbe eines Gebäudes.
  • XML ist das standardisierte Format, das es ermöglicht, XML-Daten unabhängig vom Übertragungsmedium der XML-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.

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 Dateipfad XML zu navigieren.
  • Zeilennummern und unnötige Zeichen in der XML-Datei entfernen.
  • Geben Sie xsd test.XML ein, um eine XSD-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 die C#-Klassen zu erstellen, die der XML-Datei entsprechen.
  • Eine test.cs-Datei wird erstellt, eine C#-Klasse mit einem exakten Schema der XML-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;
        }
    }
}
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

Verwandter Artikel - Csharp Object