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ファイルを生成するXSDLastFM.xmlを指定します。次に、CSファイルを生成するXSDLastFM.XSDを指定します。それをあなたが書いたものと比較し、間違いがないか確認してください。

于 2010-11-03T17:44:10.673 に答える