2016-08-17 43 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

我的不好,我留下了一些代碼,因爲它不工作,但複製完整的代碼後。是的,這是有效的。 –

相關問題