2015-09-25 4 views
1

Я пытаюсь десериализовать XML в объект C#, который имеет множество элементов того же типа. Я упростил содержание для ясности. Мой C# класс выглядит следующим образом:Deserialize XML в объект C# со списком

[XmlInclude(typeof(RootElement))] 
[XmlInclude(typeof(Entry))] 
[Serializable, XmlRoot("Form")] 
public class DeserializedClass 
{ 
    public List<Entry> listEntry; 
    public RootElement rootElement { get; set; } 
} 

Затем я определяю классы въездных и RootElement следующим образом:

public class RootElement 
{ 
    public string rootElementValue1 { get; set; } 
    public string rootElementValue2 { get; set; } 
} 

public class Entry 
{ 
    public string entryValue1 { get; set; } 
    public string entryValue2 { get; set; } 
} 

И структура XML Я пытаюсь десериализацией выглядит так:

<Entry property="value"> 
    <entryValue1>Data 1</entryValue1> 
    <entryValue2>Data 2</entryValue2> 
    <RootElement> 
    <rootElementValue1>Data 3</rootElementValue1> 
    <rootElementValue2>Data 4</rootElementValue2> 
    </RootElement> 
    <RootElement> 
    <rootElementValue1>Data 5</rootElementValue1> 
    <rootElementValue2>Data 6</rootElementValue2> 
    </RootElement> 
</Entry> 

Как вы можете видеть, будет несколько элементов RootElement, которые я хочу десериализовать в Список объектов C#. Для десериализации я использую следующее:

XmlSerializer serializer = new XmlSerializer(typeof(DeserializedClass));  
using (StringReader reader = new StringReader(xml)) 
{ 
    DeserializedClass deserialized = (DeserializedClass)serializer.Deserialize(reader); 
    return deserialized; 
} 

Любые идеи, как исправить это?

ответ

5

Я отлажены классы немного для вашего кода десериализации работать:

[Serializable, XmlRoot("Entry")] 
public class DeserializedClass 
{ 
    public string entryValue1; 
    public string entryValue2; 

    [XmlElement("RootElement")] 
    public List<RootElement> rootElement { get; set; } 
} 

public class RootElement 
{ 
    public string rootElementValue1 { get; set; } 
    public string rootElementValue2 { get; set; } 
} 

Сейчас он работает отлично.

Я не знаю, почему вы объявили свой XmlRoot «формой», поскольку в XML с этим именем нет элемента, поэтому я заменил его «Entry».

Вы не можете использовать класс Entry с свойствами entryvalue1 и entryvalue2, поскольку они являются прямыми дочерними элементами корня (событие), и нет дочернего элемента в качестве записи. Короче говоря, ваши классы должны отражать иерархию XML, чтобы десериализация могла работать должным образом.

+0

Удивительный! Отлично работает. – CorribView