如何序列化重复元素的XML节点

时间:2016-11-09 09:50:13

标签: c# xml-serialization

我正在尝试将一些XML反序列化为一个项目数组。

这是XML:

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

我的班级:

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

然后我反序列化:

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(应为2)。

这里有一个类似的解决方案:https://stackoverflow.com/questions/15544517但它似乎仅在XML节点名称与类名相同时才有效(我的大小写不同)。

我需要修改哪些内容以确保所有项目反序列化?

2 个答案:

答案 0 :(得分:1)

Xml Root&#34; items&#34;缺少

你的课应该是:

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

反序列化的代码:

        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;
        }

答案 1 :(得分:0)

根节点为<items>,因此Item类不应具有XmlRoot属性,而应使用XmlType属性:

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