2010-11-03 3 views
2

Просто для удовольствия я играл с API Last.fm. XML-файл, который они возвращают для лучших исполнителей, структурирован следующим образом:Невозможно обезвреживать этот 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> 

Вот как я обезвреживаю это.

У меня есть класс с именем lfmStatus:

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

и класс художников:

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

    } 

А потом я deserealize, используя этот код:

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

Теперь, этот код работает отлично подходит для XML, если у него не было тега topartists, охватывающего всех художников. Но как это сделать, как мне изменить свой код, чтобы справиться с этим? Я предполагаю, что мне нужно добавить еще один класс.

ответ

3

Вам не хватает атрибута (ов) на несколько типов.

См. XmlAttributeAttribute для более подробной информации.

Вам также не хватает типа элемента topartists.

Если бы я был вами, я бы получил схему XML и просто использовал xsd.exe для генерации классов C# и изменения оттуда. Он также может вывести схему на основе XML, если вы действительно не можете ее найти, это даст вам результат анализа на основе входного XML.

1

Чтобы посмотреть, что вы написали правильный код для десериализации XML-ответа, вы можете использовать XSD. Откройте командную строку VS и дайте XSD LastFM.xml, который генерирует и файл XSD. Теперь дайте XSD LastFM.XSD, который будет генерировать CS-файл. сравните это с тем, который вы написали, и проверьте, не сделали ли вы какие-либо ошибки.