2010-12-11 5 views
1

Ich habe eine XML-Datei mit folgendem Format:Umbenennen von Array-Elemente in einem flachen xml Array mit einem XmlSerializer

<?xml version="1.0" encoding="UTF-8"?> 
<Items> 
    <Item Property1="A" Property2="B" /> 
    <Item Property1="C" Property2="D" /> 
</Items> 

Ich brauche die <Item> Elemente als Objekte der Klasse lesen MyClass eine XmlSerializer verwenden.

public class MyCLass 
{ 
    [XmlAttribute] 
    public string Property1 { get; set; } 

    [XmlAttribute] 
    public string Property2 { get; set; } 
} 

Derzeit habe ich den folgenden Code die Datei zu lesen:

XmlSerializer serializer = 
    new XmlSerializer(typeof(MyClass[]), new XmlRootAttribute(@"Items")); 

MyClass[] list = (MyClass[])serializer.Deserialize(...); 

Da der Elementname <Item> unterscheidet sich von dem Klassennamen MyCLass, die Elemente in der Anordnung sind überhaupt nicht deserialisiert. Der obige Code funktioniert, wenn ich MyClass zu Item umbenenne, aber leider bin ich nicht erlaubt, die XML-Datei oder die Klassennamen zu ändern.

Wie gehe ich über die Zuordnung der beiden, so dass die Datei korrekt gelesen werden kann?

Vielen Dank im Voraus!

Antwort

3

eine Wrapper-Klasse verwenden, die das Array enthält, wird diese ermöglichen es Ihnen, das XmlElement Attribut anwenden:

public class MyClassList 
{ 
    [XmlElement("Item")] 
    public MyClass[] Items { get; set; } 
} 

var items = new[] 
{ 
    new MyClass { Property1 = "A", Property2 = "B" }, 
    new MyClass { Property1 = "C", Property2 = "D" }, 
}; 
var list = new MyClassList { Items = items }; 

using (var writer = new StringWriter()) 
{ 
    var xs = new XmlSerializer(typeof(MyClassList), new XmlRootAttribute("Items")); 
    xs.Serialize(writer, list); 
    writer.ToString().Dump(); 
} 
+0

Danke! Das funktioniert perfekt. – xmlWiz

+0

Ich bin mir nicht so sicher, warum es funktioniert :-) Ich lief nach XmlArrayItem und XmlAttributeOverrides herum. Danke noch einmal! – xmlWiz

1

Persönlich würde ich manuell serialisieren und deserialisieren - ich habe festgestellt, dass es einfacher ist, die gewünschte Flexibilität zu erhalten, als lange mit der eingebauten Serialisierung herumzuspielen und mit den verschiedenen Einschränkungen zu leben. LINQ to XML macht es ziemlich einfach. Zum Beispiel, in diesem Fall:

XDocument doc = XDocument.Load("test.xml"); 
// You could use an array if you really wanted, of course. 
List<MyClass> list = doc.Root 
         .Elements("Item") 
         .Select(x => new MyClass { 
          Property1 = (string) x.Attribute("Property1"), 
          Property2 = (string) x.Attribute("Property2"), 
         }) 
         .ToList(); 

Zwar wird diese haarigen, wenn man Objekte mit komplizierten Beziehungen serialisiert werden müssen (zwei Objekte auf das gleiche Kind bezieht oder was auch immer), aber ich habe sehr viel Erfolg hatte mit es in der Vergangenheit.

+0

Danke für den Tipp! In meinem Fall ist die MyClass-Struktur ziemlich komplex, mit geschachtelten Hierarchien - so könnte dieser Ansatz ein wenig kompliziert werden ... – xmlWiz

+0

@xmlWiz: Wenn Sie ein Muster verfolgen, bei dem jede Klasse weiß, wie sie sich deserialisiert und serialisiert, habe ich fand es nicht so schlimm - und einfach zu testen. Aber wenn Sie Referenzen usw. geteilt haben, wird es kompliziert. –

Verwandte Themen