2010-11-03 30 views
2

Juste pour m'amuser, je jouais avec l'API de Last.fm. Le fichier XML qu'ils renvoient pour les meilleurs artistes est structuré comme suit:Ne pas pouvoir déseraliser ce code XML

<lfm status="ok"> 
<topartists user="xbonez" type="overall"> 
    <artist rank="1"> 
    <name>Evanescence</name> 
    <playcount>4618</playcount> 
    <mbid>f4a31f0a-51dd-4fa7-986d-3095c40c5ed9</mbid> 
    <url>http://www.last.fm/music/Evanescence</url> 
    <streamable>1</streamable> 
    <image size="small">http://userserve-ak.last.fm/serve/34/48488613.png</image> 
    <image size="medium">http://userserve-ak.last.fm/serve/64/48488613.png</image> 
    <image size="large">http://userserve-ak.last.fm/serve/126/48488613.png</image> 
    <image size="extralarge">http://userserve-ak.last.fm/serve/252/48488613.png</image> 
    <image size="mega">http://userserve-ak.last.fm/serve/500/48488613/Evanescence++PNG.png</image> 
    </artist> 
</topartists> 
</lfm> 

Voici comment je le désérialise.

J'ai une classe appelée lfmStatus:

[Serializable()] 
     [XmlRootAttribute("lfm")] 
     public class lfmStatus 
     { 
      [XmlElement("artist")] 
      public List<Artists> TopArtists { get; set; }   
     } 

Et Artistes Classe:

[Serializable()] 
    public class Artists 
    { 
     [XmlElement("name")] 
     public string Name { get; set; } 

     [XmlElement("playcount")] 
     public int playcount { get; set; } 

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

     [XmlElement("streamable")] 
     public int streamable { get; set; } 

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

    } 

Et puis je deserealize en utilisant ce code:

string XmlFile = "artists.xml"; 
      XmlSerializer serializer = new XmlSerializer(typeof(lfmStatus)); 

      lfmStatus LoadFile; 

      using (Stream reader = new FileStream(XmlFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
      { 
       try 
       { 
        Console.WriteLine("Beginning deserialization."); 

        // Call the Deserialize method to restore the object's state. 
        LoadFile = (lfmStatus)serializer.Deserialize(reader); 

        return LoadFile.TopArtists; 
       } 

Maintenant, ce code fonctionne Idéal pour le XML si le tag topartists n'intégrait pas tous les artistes. Mais puisque c'est le cas, comment puis-je changer mon code pour gérer cela? Je suppose que j'ai besoin d'ajouter une autre classe.

Répondre

3

Il vous manque l'attribut (s) sur quelques types. Pour plus de détails, voir XmlAttributeAttribute pour plus de détails.

Il vous manque également le type de l'élément topartists.

Si j'étais vous, j'obtiendrais le schéma XML et j'utiliserais simplement xsd.exe pour générer les classes C#, et les modifier à partir de là. Il peut également déduire le schéma basé sur XML si vous ne pouvez pas le trouver, cela vous donnera un résultat analysable basé sur le XML d'entrée.

1

Pour voir que vous avez écrit le code correct pour désérialiser la réponse XML, vous pouvez utiliser XSD. Ouvrez l'invite de commande VS et donnez XSD LastFM.xml qui génère et le fichier XSD. Donnez maintenant XSD LastFM.XSD qui va générer un fichier CS. Comparez celui-là avec celui que vous avez écrit et vérifiez si vous avez fait des erreurs.