Trabajando con XmlSerializer

[forCode]

Después de ver dos métodos de lectura de datos xml «sin estructura»  (link y link), vamos a ver uno en que definamos clases y después creemos objetos a partir de leer estos datos y estructuras.

Nuestro amigo XmlSerializer! empezamos!

Lo primero de todo que vamos a necesitar es un xml (que sino!), así que para acompañar las cervezas que hicimos en el tutorial anterior, vamos a preparar unas cuantas tapas:

<?xml version="1.0" encoding="utf-8" ?>
<TapasList>
  <Tapas>
    <Tapa>
      <Nombre>Patatas bravas</Nombre>
      <Precio>3</Precio>
    </Tapa>
    <Tapa>
      <Nombre>Chocos</Nombre>
      <Precio>6</Precio>
    </Tapa>
    <Tapa>
      <Nombre>Morros</Nombre>
      <Precio>3,50</Precio>
    </Tapa>
    <Tapa>
      <Nombre>Pinchos morunos</Nombre>
      <Precio>4,50</Precio>
    </Tapa>
  </Tapas>
</TapasList>

Vale, ya tenemos nuestras tapas, ahora mediante unos sencillos metodos y unos simples tags dentro de una clase que nosotros construyamos (con la misma estructura que el xml), podremos navegar por ella como si de un objeto linq se tratase!

Primero de todo lo que necesitamos es una clase a la cual le vamos a asociar dicho xml, en nuestro caso la siguiente:

    using System;
    using System.Xml.Serialization;

    [Serializable]
    public class Tapa
    {
        [XmlElement("Nombre")]
        public string Nombre { get; set; }

        [XmlElement("Precio")]
        public string Precio { get; set; }
    }

    [Serializable]
    [XmlRoot("TapasList")]
    public class TapasCollection
    {
        [XmlArray("Tapas")]
        [XmlArrayItem("Tapa", typeof(Tapa))]
        public Tapa[] TapasList { get; set; }
    }

Puntos importantes de esta clase, los atributos:

– Serializable: Indicamos que nuestra clase es posible serializar
– XmlRoot: decimos que este será el «padre» del xml
– XmlArray: Nuestra «lista» de elementos
– XmlArrayItem: Que tipo de objeto sera nuestra lista
– XmlElement: Elementos de nuestro objeto final

Fijaros que normalmente se pone entre paréntesis el elemento relacionado del XML.

Por ultimo necesitaremos un poco de código para relacionarlos:

//Definimos que "tipo" de objeto vamos a deserializar
var serializer = new XmlSerializer(typeof(TapasCollection));

//Reader que nos va a abrir el xml
var reader = new StreamReader(@"C:\Users\Gonzalo\Documents\Visual Studio 2013\Projects\Testeos\Testeos\Tapas.xml");

//Deserializacion del objeto y transformación a list (Acordaos de que lo definimos como un array, no hay opción de XmlList :( )
var tapas = ((TapasCollection)serializer.Deserialize(reader)).TapasList.ToList();

reader.Close();

Y con esto ya tenemos nuestras tapas listas para consumir como queramos!

Un saludo!

PD: Os adjunto un pequeño .rar con el ejemplo :)

https://mega.co.nz/#!H0YwmITR!I-346Z3Bj2Wm0ZQeFk02NE-zkxE2w5ePB5Ij2nefyMk