2016-08-17 2 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'인 첫 번째 고객 노드 만 deserialize하고 목록에 추가합니다.

위의 방법을 사용자 지정 XML 판독기를 작성하여 수행하는 방법을 알고 있지만 xml 역 직렬화를 사용해야합니다. 그러나 xml deserialization을 사용하여이 작업을 수행 할 수없는 경우 고객 (s/de) erializer를 사용하여이를 수행하는 방법은 무엇입니까?

+0

그것은 작동합니다

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

나는에서 그것을 얻었다. 여기에있는 문제는 목록 멤버로 역 직렬화 할 수 없다는 것입니다. 첫 번째 고객 노드 만 deserialize합니다. XmlSerializer가 작동하지 않는다고 생각하면 다른 serialization 메서드 또는 사용자 지정 serializer를 사용하여이 작업을 수행 할 수 있습니까? –

답변

1

이 시도하십시오 : 나는 XML 시리얼이 XML을 사용하고 Is it possible to deserialize XML into List<T>?

+0

시도했습니다. 이 경우 CustomersList 개수가 0을 반환하므로 코드가 foreach 루프 안에 들어 가지 않으므로 콘솔에 이름이 기록되지 않습니다. –

+0

[XmlRoot ("XmlCheck")]를 포함한 전체 코드를 복사 했습니까? – Lucian

+0

불행히도 일부 코드는 작동하지 않지만 전체 코드를 복사 한 후에 남겨 두었습니다. 그래,이 작품. –