使用根作为列表反序列化XML文档

时间:2013-10-08 06:22:55

标签: c# xml xml-serialization

我在外部提供了一个XML文档,我需要将其导入到我的应用程序中。该文件编写得很糟糕,但不是我真正能做的很多。

<?xml version="1.0" encoding="iso-8859-1"?>
<xml>
    <Items>
        <Property1 />
        <Property2 />
        ...
    </Items>
    <Items>
        <Property1 />
        <Property2 />
        ...
    </Items>
    ...
</xml>

我应该如何使用XmlSerializer? 我使用哪个类设置似乎并不重要,或者我将XmlRoot(ElementName="xml")放在我的基类上它总是说<xml xmlns=''>是意外的。

编辑:添加了我正在使用的C#代码

[XmlRoot(ElementName = "xml")]
public class Container
{
    public List<Items> Items { get; set; }
}

public class Items
{
    public short S1 { get; set; }
    public short S2 { get; set; }
    public short S3 { get; set; }
    public short S4 { get; set; }
    public short S5 { get; set; }
    public short S6 { get; set; }
    public short S7 { get; set; }
}

public class XMLImport
{
    public Container Data{ get; private set; }

    public static XMLImport DeSerializeFromFile(string fileName)
    {
        XMLImport import = new XMLImport();
        XmlSerializer serializer = new XmlSerializer(typeof(Container));
        using (StreamReader reader = new StreamReader(fileName))
            import.Data = (Container)serializer.Deserialize(reader);
        return import;
    }
}

2 个答案:

答案 0 :(得分:5)

假设您有一个类Items映射到每个<Items>节点:

public class Items
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

您可以反序列出Items这样的列表:

var doc = XDocument.Parse(
    @"<?xml version=""1.0"" encoding=""iso-8859-1""?>
    <xml>
        <Items>
            <Property1 />
            <Property2 />
        </Items>
        <Items>
            <Property1 />
            <Property2 />
        </Items>
    </xml>");
var serializer = new XmlSerializer(typeof(List<Items>), new XmlRootAttribute("xml"));
List<Items> list = (List<Items>)serializer.Deserialize(doc.CreateReader());

答案 1 :(得分:0)

XML的根目录不是List, xml的根目录是<xml>节点我认为你只是对它的名字感到困惑:)

请访问以下链接,它有很多人投票的好答案。

以下是链接:How to Deserialize XML document

Error Deserializing Xml to Object - xmlns='' was not expected

简单地取消命名空间=:

[XmlRoot("xml"), XmlType("xml")] 
public class RegisterAccountResponse {...}