So deklarieren Sie XML mit vielen untergeordneten Knoten

  • Wenn mein XML so ist:

     <Item>
        <Name>Jerry</Name>
        <Array>
            <Item>
                <Name>Joe</Name>
            </Item>
            <Item>
                <Name>Sam</Name>
            </Item>
        </Array>
    </Item>
     

    Ich kann es serialisieren diese Klasse:

     [DataContract(Namespace = "", Name = "dict")]
    public class Item
    {
        [DataMember(Name = "Name")]
        public string Name { get; set; }
        [DataMember(Name = "Array")]
        public IEnumerable<Item> Children { get; set; }
    }
     

    Aber was ist, wenn mein XML so ist?

     <Item>
        <Name>Jerry</Name>
        <Item>
            <Name>Joe</Name>
        </Item>
        <Item>
            <Name>Sam</Name>
        </Item>
    </Item>
     

    Das funktioniert nicht:

     [DataContract(Namespace = "", Name = "Item")]
    public class Item
    {
        [DataMember(Name = "Name")]
        public string Name { get; set; }
        [DataMember(Name = "Item")]
        public IEnumerable<Item> Children { get; set; }
    }
     

    Wie kann ich die Klasse richtig dekorieren?

    22 November 2011
    Jerry Nixon - MSFTJeremy Bell
2 answers
  • Wenn Sie XML steuern möchten, ist XmlSerializer der richtige Weg, nicht DataContractSerializer. Letzterem fehlt einfach die feinkörnige Kontrolle, die XmlSerializer bietet; in diesem Fall für das Layout von Listen / Arrays - aber auch nur xml-Attribute sind ein Problem für DataContractSerializer. Dann ist es einfach:

     public class Item {
        public string Name { get; set; }
        [XmlElement("Item")]
        public List<Item> Children { get; set; }
    }
    public class Item {
        public string Name { get; set; }
    }
     

    und:

     var serializer = new XmlSerializer(typeof(Item));
    var item = (Item) serializer.Deserialize(source);
     
    22 November 2011
    Marc Gravell
  • Versuchen Sie es mit CollectionDataContractAttribute Intern sollten Sie eine generische Liste von Elementen erstellen und diese als CollectionDataContractAttribute mit entsprechenden Parametern versehen.

    22 November 2011
    George Mamaladze