2010-11-19 3 views
1

Ich habe ein XML des Formats wie hier: http://pastie.org/1311506 (nicht hier einfügen, weil Kommentar-Parser Tags löscht).Wie füge ich einer mit XmlArrayAttribute markierten Sammlung ein Attribut hinzu?

Dieses XML wird serealized/deserialisiert mit dem folgenden Code:

[XmlRoot("products")] 
public class Products 
{ 
    [XmlElement("label")] 
    public string Label { get; set; } 

    [XmlArray("cars")] 
    [XmlArrayItem("car")] 
    public Car[] Cars { get; set; } 
} 

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

... 

var products = new Products 
        { 
         Label = "1", 
         Cars = new[] 
            { 
             new Car {Name = "BMW"}, 
             new Car {Name = "Volvo"} 
            } 
        }; 
var serializer = new XmlSerializer(typeof(Products)); 
var writer = new StringWriter(); 
serializer.Serialize(writer, products); 
Console.WriteLine(writer); 

Ich brauche ein zusätzliches Attribut zu <cars> Knoten genannt type (wie hier: http://pastie.org/1311514). Wie kann ich es tun?

Mit anderen Worten, wie man Datenklassen (Produkte und Auto und vielleicht auch andere, falls notwendig) definiert, um XML des im zweiten Pasties-Link gezeigten Formats zu analysieren?

+0

"Parser löschen Tags": nicht, wenn Sie es als Code formatiert werden (Einrücken um 4 Leerzeichen oder Strg + K) –

Antwort

4

Es gibt keine einfache Möglichkeit, das zu tun, denn für Sammlungen die XmlSerializer ignoriert alle Mitglieder, es serialisiert nur die Elemente der Sammlung. Wenn Sie es jedoch nur deserialisieren möchten und das type Attribut ignorieren, ist das kein Problem: unbekannte Attribute werden nur ignoriert.

Wenn Sie den Wert type abrufen müssen, können Sie eine Klasse deklarieren, die keine Sammlung ist, aber die Sammlung enthält. So etwas Ähnliches:

public class Cars 
{ 
    [XmlElement("car")] 
    public Car[] Items { get; set; } 

    [XmlAttribute("type")] 
    public string Type { get; set; } 
} 

In Ihrer Products Klasse erklärt nur die Cars Eigenschaft vom Typ Cars mit nur ein XmlElement Attribute:

[XmlRoot("products")] 
public class Products 
{ 
    [XmlElement("label")] 
    public string Label { get; set; } 

    [XmlElement("cars")] 
    public Cars Cars { get; set; } 
} 
+0

Danke, Thomas. – DNNX

Verwandte Themen