2016-11-09 2 views
1

Ich versuche XML in ein Array von Elementen zu deserialisieren.Wie man einen XML-Knoten von wiederholten Elementen serialisiert

Hier ist der XML:

<?xml version=\"1.0\" encoding=\"utf-8\"?> 
<items> 
    <item> 
     <name>John</name> 
    </item> 
    <item> 
     <name>Jane</name> 
    </item> 
</items> 

Und meine Klasse:

[XmlRoot("item")] 
public class Item 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 
} 

ich dann deserialisieren:

var xmlSerializer = new XmlSerializer(typeof(Item[]), new XmlRootAttribute("items")); 
using (TextReader textReader = new StringReader(xmlString)) 
{ 
    var items = (Item[])xmlSerializer.Deserialize(textReader); 
    var itemCount = items.Length; 
} 

ItemCount 0 (es sollte 2).

Es gibt eine ähnliche Lösung hier: https://stackoverflow.com/questions/15544517 aber es scheint nur zu funktionieren, wenn die XML-Knotennamen identisch mit den Klassennamen sind (meine unterscheiden sich in Groß- und Kleinschreibung).

Was muss ich ändern, um sicherzustellen, dass alle Artikel deserialisiert werden?

Antwort

1

Die XML-Root "Artikel" ist

fehlt

sollte Ihre Klasse:

[XmlRoot("items")] 
    public class Items 
    { 
     [XmlElement("item")] 
     public Item[] Item { get; set; } 
    } 
    [XmlRoot("item")] 
    public class Item 
    { 
     [XmlElement("name")] 
     public string Name { get; set; } 
    } 

Und der Code deserialisiert:

 var xmlSerializer = new XmlSerializer(typeof(Items), new XmlRootAttribute("items")); 
     using (TextReader textReader = new StringReader(xmlString)) 
     { 
      var items = (Items)xmlSerializer.Deserialize(textReader); 
      var itemCount = items.Item.Length; 
     } 
+0

Ich habe gemanaged, um Ihre Lösung früher zur Arbeit zu bringen. Leider brauche ich das Objekt zurück zu einem Array/Liste/Sammlung usw. Ich möchte in der Lage sein, nur Elemente zu haben. Länge – openshac

+0

Ich bin nicht sicher zu verstehen, in meiner Antwort werden Sie eine Liste/Array von "Name" haben: foreach (var Element in items.Item) {Response.Write (item.Name); } wird zurückkehren ==> John, Jane – Yanga

+0

Lassen Sie mich versuchen und klären. Ich möchte in der Lage sein, die folgende Aussage zu schreiben: foreach (var item in items). Ähnlich dieser Lösung: https://stackoverflow.com/questions/15544517 – openshac

0

Der Wurzelknoten ist <items>, so dass die Item Klasse sollte das Attribut nicht haben, stattdessen sollte das XmlType Attribut verwenden:

[XmlType("item")] 
public class Item 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 
} 
Verwandte Themen