Buscar este blog

lunes, 22 de febrero de 2010

Leyendo y Escribiendo XML con Linq en c#

En este ejemplo uso Linq para crear XML desde un árbol de objetos y después poder leer de nuevo el XML con Linq y crear de nuevo los objetos.
Por supuesto para correr los ejemplos hay que crear los tipos de datos necesarios, todas las colecciones son de tipo List<>
Escribir (Linq a XML):


   1:  List<Pelicula> peliculas = new PeliculaTA().Retrieve();
   2:  var xmlArch =
   3:      new XElement("Peliculas",
   4:      from m in peliculas
   5:      select new XElement("Pelicula",
   6:          new XElement("Titulo", m.Titulo),
   7:          new XElement("Director", m.Director),
   8:          new XElement("Estrenado", m.Estrenado),
   9:          new XElement("Actores",
  10:              from a in m.Actores
  11:              select new XElement("Actor",
  12:                  new XElement("Nombre", a.Nombre),
  13:                  new XElement("Nacimiento", a.Nacimiento),
  14:                  new XElement("Roles",
  15:                      from r in a.Roles
  16:                      select new XElement("Rol",
  17:                          new XElement("NombrePelicula", r.Pelicula),
  18:                          new XElement("NombreRol", r.NombreRol)))))));
  19:  File.WriteAllText("peliculas.xml", xmlArch.ToString());

Leer (XML a Linq):


   1:  XElement xmlArch = XElement.Load("peliculas.xml");
   2:  var peliculas =
   3:      from m in xmlArch.Descendants("Pelicula")
   4:      select new Pelicula {
   5:          Titulo = (string)m.Element("Titulo"),
   6:          Director = (string)m.Element("Director"),
   7:          Estrenado = (DateTime)m.Element("Estrenado"),
   8:          Actores = (from c in m.Elements("Actores").Descendants("Actor")
   9:                     select new Actor {
  10:                         Nombre = (string)c.Element("Nombre"),
  11:                         Nacimiento = (DateTime)c.Element("Nacimiento"),
  12:                         Roles = (from r in c.Elements("Roles").Descendants("Rol")
  13:                                  select new Rol {
  14:                                      Pelicula = (string)r.Element("NombrePelicula"),
  15:                                      NombreRol = (string)r.Element("NombreRol")
  16:                                  }).ToList()
  17:                     }).ToList()
  18:      };

El resultado de el último ejemplo es un Enumerable<pelicula> el cual hay que recorrer por ejemplo con foreach para obtener resultados.

Para aprender mas acerca de 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

1 comentario:

  1. Funciona? Si hay más de una película en el xml las guarda en "películas", es tipo lista?. Tengo un problema similar y uso tu código pero no me funciona correctamente.

    ResponderEliminar