将XML反序列化为具有不同成员C#的类

时间:2016-08-17 11:07:57

标签: c# xml serialization deserialization

我在将xml反序列化为类对象时遇到了问题。该类与xml的结构略有不同,因此无法对其进行反序列化。以下是主要代码

public class Customer
{
    [XmlElement(ElementName = "CustomerName")]
    public string Name { get; set; }
}

public class XmlCheck
{
    [XmlElement(ElementName = "Customer")]
    public Customer Customer { get; set; }

    public List<Customer> CustomersList { get; set; }
}

class Program
{
    static string xml = @"<?xml version=""1.0"" ?>
    <XmlCheck>
    <Customer>
    <CustomerName>Omer</CustomerName>
    </Customer>
    <Customer>
    <CustomerName>Ali</CustomerName>
    </Customer>
    </XmlCheck>";

    static void Main(string[] args)
    {
        var serializer = new XmlSerializer(typeof(XmlCheck), new XmlRootAttribute("XmlCheck"));
        using (var stringReader = new StringReader(xml))
        using (var reader = XmlReader.Create(stringReader))
        {
            var xmlResult = (XmlCheck)serializer.Deserialize(reader);
            xmlResult.CustomersList.Add(xmlResult.Customer);
            Console.WriteLine(xmlResult.Customer.Name);
        }
    }

有没有办法将xml反序列化到客户列表中而不必在xml中插入该节点?目前,这仅反序列化名为“Omer&#39;”的第一个客户节点。并将其添加到列表中。

我知道如何通过编写自定义xml阅读器来完成上述操作,但需要使用xml反序列化。但是,如果使用xml反序列化是不可能的,那么使用任何客户(s / de)erializer实现此目的的方法是什么?

1 个答案:

答案 0 :(得分:1)

请试试这个:

public class Customer
{
    [XmlElement(ElementName = "CustomerName")]
    public string Name { get; set; }
}

[XmlRoot("XmlCheck")]
public class XmlCheck
{

    [XmlElement(ElementName = "Customer")]
    public List<Customer> CustomersList { get; set; }
}

class Program
{
    static string xml = @"<?xml version=""1.0"" ?>
<XmlCheck>
<Customer>
<CustomerName>Omer</CustomerName>
</Customer>
<Customer>
<CustomerName>Ali</CustomerName>
</Customer>
</XmlCheck>";

    static void Main(string[] args)
    {
        var serializer = new XmlSerializer(typeof(XmlCheck), new XmlRootAttribute("XmlCheck"));
        using (var stringReader = new StringReader(xml))
        using (var reader = XmlReader.Create(stringReader))
        {
            var xmlResult = (XmlCheck)serializer.Deserialize(reader);
            //xmlResult.CustomersList.Add(xmlResult.Customer);
            foreach(var c in xmlResult.CustomersList)
            {
                Console.WriteLine(c.Name);
            }
        }
    }
}

我是从Is it possible to deserialize XML into List<T>?

获得的