Pregunta

Sólo un poco de diversión que estaba jugando con la API de Last.fm. El archivo XML que regresen para los mejores artistas se estructura de la siguiente manera:

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

Esta es la forma en que estoy deserealizing él.

Tengo una clase llamada lfmStatus:

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

y una clase de artistas:

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

    }

Y entonces deserealize utilizando este código:

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

Ahora, este código funciona muy bien para el XML si no tiene la etiqueta topartists que envuelve a todos los artistas. Pero ya que lo hace, ¿cómo cambio mi código para manejar eso? Asumo que tengo que añadir otra clase.

¿Fue útil?

Solución

se echa en falta el atributo (s) en unos pocos tipos.

XmlAttributeAttribute para obtener más detalles.

También se echa en falta el tipo de elemento topartists.

Si yo fuera usted, me gustaría obtener el esquema XML y sólo tiene que utilizar xsd.exe para generar las clases de C #, y modificar desde allí. También se puede inferir el esquema basado en XML si realmente no lo encuentra, lo que le dará un resultado apta para su procesamiento basado en el XML de entrada.

Otros consejos

Para ver que escribió el código correcto para deserializar el XML de respuesta puede utilizar XSD. Abrir VS símbolo del sistema y dar XSD LastFM.xml que genera y archivo XSD. Ahora dar XSD LastFM.XSD que generará un archivo de CS. comparar esa con la que usted ha escrito y comprobar si ha cometido ningún error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top