HOWTO · Csharp

XML zu Objekt deserialisieren in C#

In diesem Tutorial lernen Sie anhand von Beispielen die verschiedenen Methoden zum Deserialisieren eines XML-zu-C#-Objekts kennen. Verwenden Sie die spezielle Funktion zum Einfügen von Visual Studio, das xsd-Tool, und geben Sie die entsprechende Klasse in C# ein.

Auf dieser Seite

Um XML in ein C#-Objekt zu deserialisieren, definieren Sie eine Klasse mit Membern, die zum Dokument passen, und verwenden Sie XmlSerializer. Sie können die Klasse selbst schreiben, sie anhand eines XML-Beispiels mit Visual Studio Paste Special generieren oder sie aus einem XML-Schema mit dem XSD-Tool erzeugen. Bei der Klassengenerierung entsteht ein Typ; beim separaten Deserialisierungsschritt wird XML in eine Instanz dieses Typs eingelesen.

Manuell definierte Klassen verwenden, um XML in ein C#-Objekt zu deserialisieren

Bei XML wie <Company><Employee name="Ana" age="30" /></Company> wird das Wurzelelement dem Typ Company, werden wiederholte Employee-Elemente einer Sammlung und die Attribute name und age Eigenschaften mit dem Attribut XmlAttribute zugeordnet. Achten Sie darauf, dass Element- und Attributnamen übereinstimmen, und berücksichtigen Sie Namespaces, sofern das Dokument welche verwendet. XmlSerializer nutzt diese Zuordnungen, um das Dokument in den Objektgraphen einzulesen.

Führen Sie das vollständige Beispiel aus. Der Code sowie die darin angezeigten Bezeichnungen und die Ausgabe bleiben unverändert auf Englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

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

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

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

public class Program
{
    public static void Main()
    {
        const string xml = "<Company><Employee name=\"Ana\" age=\"30\" /><Employee name=\"Bo\" age=\"32\" /></Company>";
        var serializer = new XmlSerializer(typeof(Company));
        using (var reader = new StringReader(xml))
        {
            var company = (Company)serializer.Deserialize(reader);
            Console.WriteLine($"Employees: {company.Employees.Count}; first: {company.Employees[0].Name}, {company.Employees[0].Age}");
        }
    }
}
Employees: 2; first: Ana, 30

Wenn eine Anwendung eine Datei einliest, übergeben Sie Deserialize dafür einen StreamReader statt des StringReader. XmlSerializer.Deserialize gibt ein object zurück. Wandeln Sie diesen Wert in den vom Serializer erwarteten Wurzeltyp um, wie in diesem Beispiel in Company. Bei der Deserialisierung wird XML in ein Objekt eingelesen; die Serialisierung führt den umgekehrten Vorgang aus und schreibt ein Objekt als XML. Weicht ein Wert oder Elementname von der Klassenzuordnung ab, passen Sie den Typ oder seine Serialisierungsattribute an das Dokument an.

Mit Visual Studio Paste Special C#-Klassen aus XML generieren

Paste Special erstellt anhand eines repräsentativen XML-Beispiels ein erstes Klassenmodell. Kopieren Sie das XML-Dokument, öffnen Sie in Visual Studio eine C#-Datei oder erstellen Sie eine neue und wählen Sie anschließend Edit > Paste Special > Paste XML As Classes. Der Screenshot zeigt den Befehl im Untermenü Paste Special des Menüs Edit.

Visual-Studio-Menü Edit mit geöffnetem Untermenü Paste Special und ausgewähltem Befehl Paste XML As Classes

Der Screenshot zeigt Paste XML As Classes im geöffneten Menü Edit > Paste Special.

Verwenden Sie die generierten Klassen als Zieltypen für XmlSerializer; der Menübefehl liest kein Dokument in ein Objekt ein. Prüfen Sie die generierten Membernamen und Attribute anhand des tatsächlichen XML, insbesondere wenn Dokumente Namespaces, optionale Felder oder wiederholte Elemente enthalten. Die genaue generierte Struktur kann vom Beispiel abhängen. Betrachten Sie sie daher als Entwurf und nehmen Sie erforderliche Anpassungen in Ihrem Projekt vor. Ist der Menüeintrag in Ihrer Umgebung nicht verfügbar, verwenden Sie die oben beschriebene manuelle Zuordnung oder den folgenden Schemaweg. Dieser Artikel setzt keine bestimmte Visual-Studio-Version oder Workload voraus.

Mit dem XSD-Tool C#-Klassen aus XML generieren

Der Arbeitsablauf mit dem XSD umfasst zwei getrennte Umwandlungen: Erstellen Sie zunächst aus einem repräsentativen XML-Dokument ein XML-Schema und generieren Sie anschließend daraus C#-Klassen. Liegen die Dateien in einem Arbeitsverzeichnis, lautet die Befehlsfolge xsd test.xml und danach xsd /c test.xsd. Der erste Befehl schreibt eine Schemadatei; der zweite fordert die Generierung von C#-Klassen aus diesem Schema an. Die Befehle veranschaulichen die Eingaben des Tools und ihre Reihenfolge. Verfügbarkeit und Aufruf können je nach installierter Entwicklungsumgebung variieren. Verwenden Sie daher die Dokumentation zum XSD-Tool für Ihre Umgebung, statt einen bestimmten Installationspfad vorauszusetzen.

Generierte Klassen- und Membernamen können von selbst geschriebenen Namen abweichen. Die Zuordnungsmetadaten für XML ermöglichen es XmlSerializer, Dokumentelemente und Attribute zuzuordnen. Binden Sie nach der Generierung die entstandenen Klassen in die Anwendung ein und deserialisieren Sie das XML-Dokument nach demselben oben gezeigten XmlSerializer-Muster in den generierten Wurzeltyp. Durch das Generieren eines Schemas oder einer Quelldatei allein entsteht kein befülltes Objekt. Verwenden Sie manuelle Klassen für ein kleines, stabiles Format, Paste Special für ein XML-Beispiel in der IDE oder den Schemaweg, wenn ein XSD zum Arbeitsablauf gehört oder die generierten Typen vorgeben soll.