2010-11-03 52 views
2

只是爲了一些樂趣,我玩的是Last.fm的API。他們返回頂級藝術家的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; }   
     } 

和A類藝術家:

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

現在,此代碼工作如果它沒有包含所有藝術家的topartists標籤,那麼對XML很有用。但既然它,我該如何改變我的代碼來處理呢?我假設我需要添加另一個班級。

回答

3

您錯過了幾種類型的屬性。

查看XmlAttributeAttribute瞭解更多詳情。

您還缺少topartists元素的類型。

如果我是你,我會得到XML模式,並使用xsd.exe生成C#類,然後從那裏修改。如果你真的找不到它,它也可以推斷基於XML的模式,這會給你一個基於輸入XML的可解析結果。

1

爲了看到您爲反序列化XML編寫了正確的代碼,您可以使用XSD。打開VS命令提示符並給XSD LastFM.xml生成XSD文件。現在給XSD LastFM.XSD它將生成一個CS文件。把這個和你寫的一個進行比較,並檢查你是否犯了錯誤。