2016-08-17 78 views
1

我在将xml反序列化为类对象时遇到问题。这个类与xml有一个稍微不同的结构,所以我无法反序列化它。以下是主代码将XML反序列化到具有不同成员的类中C#

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”的第一个客户节点,并将其添加到列表中。

我知道如何通过编写自定义xml读取器来完成上述操作,但需要使用xml反序列化。但是,如果这是不可能的使用XML反序列化,任何方式来实现这一点使用任何客户(S/DE)的Erializer?

+0

我使用这个XML与XML序列化和它的作品。这里的问题是我无法反序列化到列表成员,它只反序列化第一个客户节点。如果您认为XmlSerializer无法正常工作,那么可以使用其他序列化方法或自定义序列化程序来使用它? –

回答

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>?

+0

试过这个。该代码不会进入foreach循环,因为在这种情况下,CustomersList计数返回0,所以没有名称写在控制台上。 –

+0

您是否复制了包含[XmlRoot(“XmlCheck”)]的整个代码? – Lucian

+0

我的不好,我留下了一些代码,因为它不工作,但复制完整的代码后。是的,这是有效的。 –