Buscar este blog

martes, 8 de marzo de 2011

Linq a XSD: leyendo xml con tipos

Como hemos comentado en una entrada anterior es muy fácil usar xml con Linq en .Net, pues bien es posible usarlo aun mas fácilmente usando Linq a Xsd que es un proyecto de Microsoft disponible en CodePlex y que nos permite crear una estructura de clases a partir de un esquema de xml que representa el contenido de nuestro xml, obviamente el requisito es que tengamos o creemos un esquema xml para poder usar esta característica. Recordemos que en una entrada anterior vimos como crear esquemas con herramientas disponibles libremente.

Instalar esta herramienta es un poco complicado por lo que en esta entrada solo dare una breve introducción a lo que se puede hacer con esta herramienta y en otra entrada incluire otros ejemplos incluyendo el procedimiento de instalación.

Lo primero es tener a la mano nuestro esquema consideremos este xsd:


   1:  <?xml version="1.0" standalone="yes"?>
   2:  <xs:schema id="Peliculas"
   3:                       targetNamespace="ProbadorConsola"
   4:                       xmlns:xs="http://www.w3.org/2001/XMLSchema"
   5:                       xmlns="ProbadorConsola"
   6:                       elementFormDefault="qualified">
   7:    <xs:element name="Peliculas">
   8:      <xs:complexType>
   9:        <xs:choice minOccurs="0" maxOccurs="unbounded">
  10:          <xs:element name="Pelicula">
  11:            <xs:complexType>
  12:              <xs:sequence>
  13:                <xs:element name="Titulo" type="xs:string" minOccurs="0" />
  14:                <xs:element name="Director" type="xs:string" minOccurs="0" />
  15:                <xs:element name="Estrenado" type="xs:string" minOccurs="0" />
  16:                <xs:element name="Actores" minOccurs="0" maxOccurs="unbounded">
  17:                  <xs:complexType>
  18:                    <xs:sequence>
  19:                      <xs:element name="Actor" minOccurs="0" maxOccurs="unbounded">
  20:                        <xs:complexType>
  21:                          <xs:sequence>
  22:                            <xs:element name="Nombre" type="xs:string" minOccurs="0" />
  23:                            <xs:element name="Nacimiento" type="xs:string" minOccurs="0" />
  24:                            <xs:element name="Roles" minOccurs="0" maxOccurs="unbounded">
  25:                              <xs:complexType>
  26:                                <xs:sequence>
  27:                                  <xs:element name="Rol" minOccurs="0" maxOccurs="unbounded">
  28:                                    <xs:complexType>
  29:                                      <xs:sequence>
  30:                                        <xs:element name="NombrePelicula" type="xs:string" minOccurs="0" />
  31:                                        <xs:element name="NombreRol" type="xs:string" minOccurs="0" />
  32:                                      </xs:sequence>
  33:                                    </xs:complexType>
  34:                                  </xs:element>
  35:                                </xs:sequence>
  36:                              </xs:complexType>
  37:                            </xs:element>
  38:                          </xs:sequence>
  39:                        </xs:complexType>
  40:                      </xs:element>
  41:                    </xs:sequence>
  42:                  </xs:complexType>
  43:                </xs:element>
  44:              </xs:sequence>
  45:            </xs:complexType>
  46:          </xs:element>
  47:        </xs:choice>
  48:      </xs:complexType>
  49:    </xs:element>
  50:  </xs:schema>

Y después el archivo xml que vamos a utilizar:


   1:  <?xml version="1.0"?>
   2:  <Peliculas xmlns="ProbadorConsola">
   3:    <Pelicula>
   4:      <Titulo>Mazinger</Titulo>
   5:      <Director>Jackie chan</Director>
   6:      <Estrenado>1975-03-19T00:00:00</Estrenado>
   7:      <Actores>
   8:        <Actor>
   9:          <Nombre>John Wayne</Nombre>
  10:          <Nacimiento>1915-10-23T00:00:00</Nacimiento>
  11:          <Roles>
  12:            <Rol>
  13:              <NombrePelicula>Mazinger</NombrePelicula>
  14:              <NombreRol>Estrella</NombreRol>
  15:            </Rol>
  16:          </Roles>
  17:        </Actor>
  18:      </Actores>
  19:    </Pelicula>
  20:    <Pelicula>
  21:      <Titulo>Terminator</Titulo>
  22:      <Director>James Cameron</Director>
  23:      <Estrenado>1985-02-14T00:00:00</Estrenado>
  24:      <Actores>
  25:        <Actor>
  26:          <Nombre>Arnold</Nombre>
  27:          <Nacimiento>1953-10-11T00:00:00</Nacimiento>
  28:          <Roles>
  29:            <Rol>
  30:              <NombrePelicula>Terminator</NombrePelicula>
  31:              <NombreRol>Protagonista</NombreRol>
  32:            </Rol>
  33:            <Rol>
  34:              <NombrePelicula>Terminator</NombrePelicula>
  35:              <NombreRol>Enemigo</NombreRol>
  36:            </Rol>
  37:          </Roles>
  38:        </Actor>
  39:        <Actor>
  40:          <Nombre>Linda Hamilton</Nombre>
  41:          <Nacimiento>1972-08-12T00:00:00</Nacimiento>
  42:          <Roles>
  43:            <Rol>
  44:              <NombrePelicula>Terminator</NombrePelicula>
  45:              <NombreRol>Protagonista</NombreRol>
  46:            </Rol>
  47:            <Rol>
  48:              <NombrePelicula>Terminator</NombrePelicula>
  49:              <NombreRol>Perseguida</NombreRol>
  50:            </Rol>
  51:          </Roles>
  52:        </Actor>
  53:      </Actores>
  54:    </Pelicula>
  55:  </Peliculas>

Linq a XSD nos genera una jerarquía de clases que nos permite manejar el xml usando datos tipeados con soporte de Intellisense y comprobación por parte del compilador, por ejemplo para listar los datos de todos los actores:


   1:  Peliculas peliculas = Peliculas.Load("peliculas.bak.xml");
   2:  var actores = from p in peliculas.Pelicula
   3:                from a in p.Actores
   4:                from actor in a.Actor
   5:                select actor;
   6:  Console.WriteLine("Todos los actores");
   7:  foreach(var actor in actores) {
   8:      Console.Out.WriteLine("Nombre: " + actor.Nombre);
   9:      Console.Out.WriteLine("Fecha de nacimiento: " + actor.Nacimiento);
  10:  }

En conclusion Linq a XSD es un complemento muy útil para el manejo de XML en .Net Framework.
Hay que tener en cuenta que el proyecto a Marzo del 2011 aún esta en etapa Beta y es mejor probar bien nuestro código para evitar errores inesperados, como sea el proyecto es muy útil y es probable que posteriormente sea incluido como parte del .Net Framework.

Para aprender más sobre Linq visita:
Lista de artículos acerca de Linq

Para aprender más sobre el uso de XML en .Net Framework visita:
Lista de artículos acerca del uso de XML en .Net Framework

No hay comentarios:

Publicar un comentario