2

只是为了找点乐子,我在玩 Last.fm 的 API。他们返回给顶级艺术家的 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; }

    }

然后我使用这段代码去实现:

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。但既然它确实如此,我该如何更改我的代码来处理它?我假设我需要添加另一个类。

4

2 回答 2

3

您缺少一些类型的属性。

有关更多详细信息,请参阅XmlAttributeAttribute

您还缺少topartists元素的类型。

如果我是你,我会得到 XML 模式,然后使用 xsd.exe 生成 C# 类,然后从那里修改。如果你真的找不到它,它还可以根据 XML 推断模式,这将为你提供基于输入 XML 的可解析结果。

于 2010-11-03T17:13:20.437 回答
1

要查看您为反序列化响应 XML 编写的代码是否正确,您可以使用 XSD。打开 VS 命令提示符并给出生成 XSD 文件的 XSD LastFM.xml。现在给 XSD LastFM.XSD 它将生成一个 CS 文件。把那个和你写的比较一下,看看你是否犯了任何错误。

于 2010-11-03T17:44:10.673 回答