2013-02-06 3 views
14

XML 형식의 XML 파일을 수신했습니다. 프로그램채널의 많은 경우에XML 문자열을 C# 객체로 역 직렬화합니다.

<radio> 
    <channel id="Opus"> 
    <display-name>Opus</display-name> 
    <icon src="" /> 
    </channel> 
    <channel id="Klasika"> 
    <display-name>Klasika</display-name> 
    <icon src="" /> 
    </channel> 
    <channel id="LR"> 
    <display-name>LR</display-name> 
    <icon src="" /> 
    </channel> 
    <programme channel="Opus" start="20130203060000" stop="20130203110000" duration="050000"> 
    <title lang="lt">OPUS muzika.</title> 
    <desc lang="lt">OPUS muzika.</desc> 
    <category lang="lt">muzikos laidos</category> 
    <date>2013.02.03</date> 
    </programme> 
    <programme channel="Opus" start="20130203110000" stop="20130203150000" duration="040000"> 
    <title lang="lt">Vėlyvi pusryčiai su OPUS.</title> 
    <desc lang="lt">Vėlyvi pusryčiai su OPUS.</desc> 
    <category lang="lt">muzikos laidos</category> 
    <date>2013.02.03</date> 
    </programme> 
</radio> 

. 나는이 C#을 객체로 직렬화 복원하려고하지만 오브젝트 대신 널을 얻을 :

[XmlRoot("radio")] 
public sealed class radio 
{ 
    [XmlRoot("channel")] 
    public sealed class channel 
    { 
     [XmlAttribute("id")] 
     public string id { get; set; } 

     [XmlElement("display-name")] 
     public string displayName { get; set; } 

     [XmlElement("icon")] 
     public string icon { get; set; } 

     public channel() 
     {  
     } 
    } 

    [XmlRoot("programme")] 
    public sealed class programme 
    { 
     [XmlAttribute("channel")] 
     public string channel { get; set; } 

     [XmlAttribute("start")] 
     public string start { get; set; } 

     [XmlAttribute("stop")] 
     public string stop { get; set; } 

     [XmlAttribute("duration")] 
     public string duration { get; set; } 

     [XmlElement("title")] 
     public string title { get; set; } 

     [XmlElement("desc")] 
     public string desc { get; set; } 

     [XmlElement("category")] 
     public string category { get; set; } 

     [XmlElement("date")] 
     public string date { get; set; } 

     public programme() 
     { 
     } 
    } 

    [XmlArray] 
    public channel[] channels { get; set; } 

    [XmlArray] 
    public programme[] programmes { get; set; } 

    public radio() 
    { 
     channels = null; 
     programmes = null; 
    } 

    public static radio FromXmlString(string xmlString) 
    { 
     var reader = new StringReader(xmlString); 
     var serializer = new XmlSerializer(typeof(radio)); 
     var instance = (radio)serializer.Deserialize(reader); 

     return instance; 
    } 
} 

은 내가 잘못 뭘하고 무슨 일이 적절한 XML 객체 클래스 것입니까?

답변

33

당신은, 당신에게 Radio 수업을 약간 수정 한 것 같은 배열의 혼합 2 개 개체 유형부터 당신 serializer가 무엇을 알 수 있도록 몇 가지 속성을 추가해야합니다.

[XmlRoot("radio")] 
public sealed class radio 
{ 
    [XmlElement("channel", Type = typeof(channel))] 
    public channel[] channels { get; set; } 

    [XmlElement("programme", Type = typeof(programme))] 
    public programme[] programmes { get; set; } 

    public radio() 
    { 
     channels = null; 
     programmes = null; 
    } 

    public static radio FromXmlString(string xmlString) 
    { 
     var reader = new StringReader(xmlString); 
     var serializer = new XmlSerializer(typeof(radio)); 
     var instance = (radio)serializer.Deserialize(reader); 

     return instance; 
    } 
} 

[Serializable] 
public class channel 
{ 
    [XmlAttribute("id")] 
    public string id { get; set; } 

    [XmlElement("display-name")] 
    public string displayName { get; set; } 

    [XmlElement("icon")] 
    public string icon { get; set; } 

    public channel() 
    { 
    } 
} 


[Serializable] 
public sealed class programme 
{ 
    [XmlAttribute("channel")] 
    public string channel { get; set; } 

    [XmlAttribute("start")] 
    public string start { get; set; } 

    [XmlAttribute("stop")] 
    public string stop { get; set; } 

    [XmlAttribute("duration")] 
    public string duration { get; set; } 

    [XmlElement("title")] 
    public string title { get; set; } 

    [XmlElement("desc")] 
    public string desc { get; set; } 

    [XmlElement("category")] 
    public string category { get; set; } 

    [XmlElement("date")] 
    public string date { get; set; } 

    public programme() 
    { 
    } 
} 

결과 :

enter image description here

+2

당신이 한 번만 각 요소/배열/속성을 장식해야합니다 – dubi

6

사용 LINQ2XML

XElement doc=XElement.Load("yourXML.xml"); 
var channelLst=doc.Elements("channel").Select(x=> 
new 
{ 
    id=x.Attribute("id").Value, 
    displayName=x.Element("display-name").Value, 
    icon=x.Element("icon").Attribute("src").Value 
} 
); 

이제 channelLst

을 반복 할 수
foreach(var c in channelLst) 
{ 
    c.id; 
    c.displayName; 
} 
관련 문제