(De) serialisiert verschiedene Root-Elementnamen mit einer Klasse

8

Ich habe mehrere XML-Dateien mit verschiedenen Stammelementen, aber demselben Typ von untergeordneten Elementen, und ich möchte in der Lage sein, eine einzige Klasse zu erstellen, die die verschiedenen Wurzelelemente enthält, und eine andere, um jedes untergeordnete Element zu halten. Hier sind zwei Beispiele, wie die XML-Dateien aussehen.

Datei 1:

%Vor%

Datei 2:

%Vor%

Ich möchte in der Lage sein, dies zu serialisieren und zu deserialisieren, indem ich nur 2 Klassen verwende, wie:

%Vor%

Ich habe versucht, sie zu lesen mit:

%Vor%

Aber ich bekomme "There is an error in XML document (2, 2)." , weil der Deserializer ein <"Person"> root-Element und nicht ein <"John"> oder <"Paul"> erwartet. Es funktioniert gut, wenn ich [XmlRoot] zu [XmlRoot("John")] ändere, aber genau das versuche ich hier zu vermeiden.

Außerdem muss ich in der Lage sein, es mit der gleichen seltsamen XML-Struktur zu serialisieren, also muss ich den Namen des Root-Elements in der Person-Klasse speichern.

Ich weiß, ich könnte einfach meinen eigenen (De) Serialisierer erstellen, aber ich würde gerne wissen, ob es möglich ist, es mit den vorhandenen Methoden zu erreichen.

Bearbeiten 1: (zurückgesetzt).

Bearbeiten 2: hat die Änderungen von "Edit 1" rückgängig gemacht, da ich einen einfacheren Weg gefunden habe, um das zu erreichen, was ich brauchte. Siehe meine Antwort unten.

    
Henrique Miranda 15.07.2013, 15:51
quelle

4 Antworten

8

Ich habe einen sauberen und schnellen Weg gefunden, mein Problem zu lösen! Ich musste nur ein XmlRootAttribute verwenden, wenn ich den XmlSerializer instanziiere. Auf diese Weise kann ich den Namen des Root-Elements zur Laufzeit festlegen.

%Vor%

Natürlich funktioniert es auch genauso, wenn ich es serialisieren möchte.

    
Henrique Miranda 17.07.2013, 14:19
quelle
2

Die Verwendung von Personennamen als XML-Elementnamen wirkt ein wenig wackelig. Was bedeutet jedes Element, ein John oder ein Person ?

Es könnte besser sein, wenn Sie die Form dieser XML-Dateien kontrollieren können, um sie so darzustellen:

%Vor%

Und dann haben Sie eine einfache Möglichkeit, den Namen in einer Eigenschaft zu speichern, die als XML-Attribut zugeordnet ist:

%Vor%     
CSJ 15.07.2013 15:59
quelle
1

Implementieren Sie IXmlSerializable in Ihrer Klasse und führen Sie die Serialisierung wie gewünscht in den Funktionen aus:

ReadXml(System.Xml.XmlReader reader) und WriteXml(System.Xml.XmlWriter writer)

Beispiel:

%Vor%     
Siraj Mansour 15.07.2013 16:06
quelle
0

Verwende das root Element als ArrayOfClassName und versuche es dann.

%Vor%

Hier ist die Deserialize-Klasse, mit der Sie Ihre Xml-Datei deserialisieren können.

%Vor%

Rufen Sie die Klasse

auf %Vor%     
Jayesh Tank 13.09.2015 11:02
quelle

Tags und Links