2012-04-05 6 views
1

J'ai un fichier XML comme celui-ci que j'essaye de désérialiser.Impossible de désérialiser un fichier xml

<info> 
    <result resultCode="0000"><![CDATA[操作成功]]></result> 
    <songlist> 
    <song> 
     <id>63672</id> 
     <name><![CDATA[红玫瑰]]></name> 
     <singer id="1620"><![CDATA[陈奕迅]]></singer> 
     <album id="22056"><![CDATA[认了吧]]></album> 
     <remark><![CDATA[]]></remark> 
     <uploadinguser><![CDATA[]]></uploadinguser> 
     <collectinguser><![CDATA[]]></collectinguser> 
     <source> 
     <link id="3441591" filesize="3842715" format="mp3"><![CDATA[http://space6.j.cn/olympic/edit/672/63672-3842715.mp3]]></link> 
     <link id="3435011" filesize="3843133" format="mp3"><![CDATA[http://f8.wretch.yimg.com/satyedhome/32764/1165646407.mp3]]></link> 
     <link id="3434519" filesize="3842715" format="mp3"><![CDATA[http://space0.j.cn/olympic/edit/672/63672-3842715.mp3]]></link> 
     </source> 
    </song> 
    <song> 
     <id>67228</id> 
     <name><![CDATA[光荣]]></name> 
     <singer id="106"><![CDATA[BOBO]]></singer> 
     <album id="22523"><![CDATA[光荣]]></album> 
     <remark><![CDATA[]]></remark> 
     <uploadinguser><![CDATA[]]></uploadinguser> 
     <collectinguser><![CDATA[]]></collectinguser> 
     <source> 
     <link id="3437626" filesize="5106906" format="mp3"><![CDATA[http://blog.heinekenf1.net/music/gr.mp3]]></link> 
     <link id="3441621" filesize="3394663" format="mp3"><![CDATA[http://space6.j.cn/olympic/edit/228/67228-3394663.mp3]]></link> 
     <link id="3090938" filesize="3395499" format="mp3"><![CDATA[http://space5.j.cn/olympic/convert/228/67228-3395499.mp3]]></link> 
     </source> 
    </song> 
    <song>...</song> 
    <song>...</song> 
    <song>...</song> 
    <song>...</song> 
    <song>...</song> 
    <song>...</song> 
    </songlist> 
</info> 

Actuellement c'est ce que j'ai comme modèle:

[XmlRoot("info")] 
public class Response 
{ 
    [XmlElement("result")] 
    public Result Results { get; set; } 

    [XmlArray("songlist")] 
    [XmlArrayItem("song", typeof(Song))] 
    Song[] SongList { get; set; } 
} 
public class Result 
{ 
    [XmlAttribute("resultCode")] 
    public int ResultCode { get; set; } 
} 
public class Song 
{ 
    [XmlElement("name")] 
    public string Name { get; set; } 

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

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

    [XmlArray("source")] 
    [XmlArrayItem("link", typeof(Link))] 
    public Link[] Sources { get; set; } 
} 
public class Link 
{ 
    [XmlAttribute("filesize")] 
    public int FileSize { get; set; } 
    [XmlAttribute("format")] 
    public string Format { get; set; } 
    [XmlText] 
    public string URI { get; set; } 
} 

Mais quand j'ai essayé de désérialiser en utilisant le code ci-dessous, il ne soit pas bien analysé, à savoir que je ne vois pas le resultCode ni la liste des chansons (pas d'erreur cependant).

XmlSerializer s = new XmlSerializer(typeof(Response), new XmlRootAttribute("info")); 
Response response = (Response)s.Deserialize(data.CreateReader()); 

Une indication?

+1

Veuillez ne pas ajouter des choses comme "C# 4.0" à la fin de vos titres. C'est ce que les tags sont pour. De plus, votre question n'est pas spécifique à une version particulière de C#, vous n'avez donc pas besoin de spécifier. la version. –

+0

qu'est-ce que vous objet de données? Que fait .CreateReader? Est-ce qu'il retourne un XmlTextReader? –

+0

Le seul conseil que je puisse vous offrir est d'essayer de le désérialiser pièce par pièce, vous faites beaucoup en une fois et il sera difficile de savoir ce qui ne fonctionne pas. C'est comme ça que j'ai abordé des problèmes similaires dans le passé de toute façon. – DukeOfMarmalade

Répondre

4

Assurez-vous d'abord que toutes les propriétés sont publiques, car la sérialisation ne prend que des propriétés publiques. Votre morceau [] est dépourvu de modificateur d'accès et est par défaut privé.

Utilisez ceci comme un début pour désérialiser votre xml. J'ai fait quelques changements pour que ça marche. Par exemple. Création d'un élément SongList, en utilisant XmlElement plutôt que XmlArray.

[XmlRoot("info")] 
public class Response 
{ 
    [XmlElement("result")] 
    public Result Result { get; set; } 

    [XmlElement("songlist")] 
    public SongList SongList { get; set; } 
} 

public class Result 
{ 
    [XmlAttribute("resultCode")] 
    public int ResultCode { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

public class SongList 
{ 
    [XmlElement("song")] 
    public Song[] Songs { get; set; } 
} 

public class Song 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
} 

Espérons que ça aide!

Questions connexes