2008-10-22 15 views
51

Also ich xml haben, die wie folgt aussieht: Deserialisieren XML-Objekte in C#

<todo-list> 
    <id type="integer">#{id}</id> 
    <name>#{name}</name> 
    <description>#{description}</description> 
    <project-id type="integer">#{project_id}</project-id> 
    <milestone-id type="integer">#{milestone_id}</milestone-id> 
    <position type="integer">#{position}</position> 

    <!-- if user can see private lists --> 
    <private type="boolean">#{private}</private> 

    <!-- if the account supports time tracking --> 
    <tracked type="boolean">#{tracked}</tracked> 

    <!-- if todo-items are included in the response --> 
    <todo-items type="array"> 
    <todo-item> 
     ... 
    </todo-item> 
    <todo-item> 
     ... 
    </todo-item> 
    ... 
    </todo-items> 
</todo-list> 

Wie würde ich mich über .NET die Serialisierung Bibliothek mit diesem in C# Objekte deserialisieren?

Zur Zeit verwende ich Reflexion und ich zwischen den XML und meine Objekte unter Verwendung der Benennungskonventionen.

Antwort

57

Erstellen Sie eine Klasse für jedes Element, das eine Eigenschaft für jedes Element und eine Liste oder ein Array von Objekten (verwenden Sie die erstellte) für jedes untergeordnete Element hat. Rufen Sie dann System.Xml.Serialization.XmlSerializer.Deserialize für die Zeichenfolge auf und geben Sie das Ergebnis als Ihr Objekt aus. Verwenden Sie die System.Xml.Serialization-Attribute, um Anpassungen vorzunehmen, z. B. um das Element Ihrer ToDoList-Klasse zuzuordnen, verwenden Sie das XmlElement-Attribut ("todo-list").

Ein Shourtcut ist das Laden Ihrer XML in Visual Studio, klicken Sie auf die Schaltfläche "Infer Schema" und führen Sie "xsd.exe/c schema.xsd" aus, um die Klassen zu generieren. xsd.exe befindet sich im Ordner "Tools". Gehen Sie dann durch den generierten Code und nehmen Sie Anpassungen vor, z. B. Ändern von Kurzschlüssen in Ints.

+2

In VS2010 heißt es "Create Schema" und kann mehrere xsd-Dateien generieren (eine pro Namespace). In diesem Fall fügen Sie diejenigen in den Befehl ein, z. B. "xsd.exe/c schema.xsd schema1.xsd" (usw.) ausführen. –

+5

In VS 2012 und später haben Sie auch "XML als Klassen einfügen" im Menü Bearbeiten. –

+4

'Bearbeiten> Inhalte einfügen> XML als Klassen einfügen' Sehr schön, @ JonathanAllen, genau das, was ich brauchte. – JMD

31

läuft darauf hinaus, mit xsd.exe von Werkzeugen in VS unten:

xsd.exe "%xsdFile%" /c /out:"%outDirectory%" /l:"%language%" 

es dann laden mit Lesern und Deserializer:

public GeneratedClassFromXSD GetObjectFromXML() 
{ 
    var settings = new XmlReaderSettings(); 
    var obj = new GeneratedClassFromXSD(); 
    var reader = XmlReader.Create(urlToService, settings); 
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(GeneratedClassFromXSD)); 
    obj = (GeneratedClassFromXSD)serializer.Deserialize(reader); 

    reader.Close(); 
    return obj; 
} 
+1

+1 guter Link, viele Zeilen Code gespeichert –

+1

Hmmm, im Beispiel nehme ich an, dass die Variable 'urlToService' das serialisierte XML darstellt? Und sollte diese Variable ein Argument für GetObjectFromXML() sein? – DavidRR

3

Es gibt ein paar verschiedene Möglichkeiten.

  • Visual Studio enthält ein Befehlszeilenprogramm namens xsd.exe. Sie verwenden dieses Programm zum Erstellen eines Schemadokuments und verwenden das Programm erneut für das Schemadokument, um Klassen zu erstellen, die Sie verwenden können. Sie können möglicherweise einfach Dataset.ReadXml() darauf aufrufen.
4

Nun, würden Sie Klassen müssen in Ihre Assembly, die in etwa dem XML entspricht (Eigenschaft namens Private, eine Auflistungseigenschaft namens ToDo usw.).

Das Problem ist, dass das XML Elemente enthält, die für Klassennamen ungültig sind. Daher müssten Sie IXmlSerializable in diesen Klassen implementieren, um zu steuern, wie sie zu und von XML serialisiert werden. Möglicherweise können Sie auch einige der XML-Serialisierungs-spezifischen Attribute verwenden, aber das hängt vom XML-Schema ab.

Das ist ein Schritt über die Reflexion, aber es ist vielleicht nicht genau das, was Sie erhoffen.

4

Kasse http://xsd2code.codeplex.com/

Xsd2Code ist ein CSharp oder Visual Basic Business Entity-Klasse Generator aus XSD-Schema.

+0

@Deepfreezed: bitte geben Sie mehr Details. Wie würde dies das Problem in dieser Frage lösen? Zeigen Sie vielleicht ein Codebeispiel für die Verwendung des Tools. –

+0

Zuerst habe ich das XSD-Schema für das XML mit VS generiert. Dann habe ich das Code-Generierungs-Tool oben ausgeführt. Dies erzeugte eine Klasse/ein Objekt, mit der ich das XML serialisieren kann. Dieses Tool ist in VS 2008/2010 integriert. Es hat auch einige nette Eigenschaften wie generische Sammlungen. – Deepfreezed

14

Deserialize jedes Objekt, solange der Typ T Serializable markiert:

function T Deserialize<T>(string serializedResults) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using (var stringReader = new StringReader(serializedResults)) 
     return (T)serializer.Deserialize(stringReader); 
} 
+0

Anstelle von 'Deserialize (string s)', meinst du 'Deserialize (string serializedResults)' '? – DavidRR

+0

Behoben. Danke @DavidRR! – Keith

-1

i die gleichen Fragen hatte vor einigen Jahren, dass, wie abt xml Zuordnung zu C# -Klassen oder das Erstellen von C# -Klassen, die zu unserer abgebildet werden XMLs, jst wie wir es im Entity Framework machen (wir ordnen Tabellen C# -Klassen zu). Ich habe schließlich ein Framework erstellt, mit dem C# -Klassen aus Ihrem XML erstellt werden können und diese Klassen zum Lesen/Schreiben Ihrer XML-Datei verwendet werden können. Habe eine look

Verwandte Themen