2010-11-19 5 views
1

J'ai un XML au format comme ici: http://pastie.org/1311506 (ne l'insère pas ici car l'analyseur de commentaire supprime les balises).Comment ajouter un attribut à une collection marquée avec XmlArrayAttribute?

Ce fichier XML est serealized/désérialisée en utilisant le code suivant:

[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); 

je besoin d'un attribut supplémentaire au noeud <cars> appelé type (comme ici: http://pastie.org/1311514). Comment puis-je le faire? En d'autres termes, comment définir des classes de données (Products and Car et éventuellement d'autres si nécessaire) afin d'analyser XML du format affiché dans le second lien pastie?

+0

« analyseur supprime les balises »: pas si vous formatez code (indenter de 4 espaces ou utiliser Ctrl + K) –

Répondre

4

Il n'y a pas de moyen facile de le faire, car pour les collections, le XmlSerializer ignore tous les membres, il ne fait que sérialiser les éléments de la collection. Cependant, si vous voulez seulement le désérialiser et ignorer l'attribut type, ce n'est pas un problème: les attributs inconnus seront juste ignorés.

Si vous devez obtenir la valeur type, vous pouvez déclarer une classe qui n'est pas une collection, mais qui contient la collection. Quelque chose comme ça:

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

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

Dans votre Products classe, déclarer que la propriété Cars de type Cars avec juste un XmlElement attribut:

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

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

Merci, Thomas. – DNNX

Questions connexes