6 de febrero de 2010

LINQ to XML, Leer Archivo XML C#

Veamos mediante un ejemplo práctico y sencillo como leer desde el disco un archivo XML con .NET (C#).

En el .NET 3.5 se han agregado 3 nuevas clases (XDocument, XElement, XAttribute) relacionadas al espacio de nombre (namespace) System.Xml.Linq; con estas clases de .NET es muy simple leer un fichero XML, veamos un ejemplo de como hacerlo, para ello usaremos C#.

Pero antes veamos el fichero XML que pretendemos leer.

Archivo XML a Leer

<?xml version="1.0" encoding="utf-8"?>
<Contactos>
  <Contacto>
    <Nombre>Juan</Nombre>
    <EMail>juan@gmail.com</EMail>
    <Telefono Tipo="Móvil">666666666</Telefono>
    <Telefono Tipo="Trabajo">911111111</Telefono>
  </Contacto>
  <Contacto>
    <Nombre>Luis</Nombre>
    <EMail>luis@gmail.com</EMail>
    <Telefono Tipo="Móvil">666777777</Telefono>
  </Contacto>
  <Contacto>
    <Nombre>María</Nombre>
    <EMail>maria@gmail.com</EMail>
    <Telefono Tipo="Móvil">666888888</Telefono>
    <Telefono Tipo="Personal">91222222</Telefono>
  </Contacto>
</Contactos>

 

Código LINQ XML para leer Archivo

Existen varias formas en .NET C# para leer un fichero XML, acá expondremos 2 formas distintas aunque si fuera yo quien tuviese que elegir me quedaría con esta primera variante de código para leer un archivo XML. Esta primera variante usa el método Descendants que existe en ambas clases (XElement y XDocument):

// Código para leer un fichero XML usando LINQ 2 XML
private static void Linq2XmlLeerFicheroXmlConXElement()
{
  XElement xmlContactos = XElement.Load("Contactos.xml");
 
  //Obtener el Nombre de todos los contactos
  var contactosAll =
    from c in xmlContactos.Descendants("Contacto")
    select c.Element("Nombre").Value;
 
  //Obtener todos los contactos cuyo nombre comiencen con L
  var contactosL =
    from c in xmlContactos.Descendants("Contacto")
    where c.Element("Nombre").Value.StartsWith("L")
    select c;
 
  //Obtener todos los contactos que al menos uno de los Telefonos sea de Tipo Personal
  var contactosTelPers =
    from c in xmlContactos.Descendants("Contacto")
    where null != c.Elements("Telefono").Attributes("Tipo").
                  FirstOrDefault(t => t.Value == "Personal")
    select c;
}

Otra variante de código para obtener el mismo resultado:

// Código para leer un fichero XML usando LINQ 2 XML
private static void Linq2XmlLeerFicheroXml()
{
  XDocument docContactos = XDocument.Load("Contactos.xml");
 
  //Obtener el Nombre de todos los contactos
  var contactosAll =
    from c in docContactos.Elements("Contactos").Elements("Contacto")
    select c.Element("Nombre").Value;
 
  //Obtener todos los contactos cuyo nombre comiencen con L
  var contactosL =
    from c in docContactos.Elements("Contactos").Elements("Contacto")
    where c.Element("Nombre").Value.StartsWith("L")
    select c;
 
  //Obtener todos los contactos que al menos uno de los Telefonos sea de Tipo Personal
  var contactosTelPers =
    from c in docContactos.Elements("Contactos").Elements("Contacto")
    where null != c.Elements("Telefono").Attributes("Tipo").
                  FirstOrDefault(t => t.Value == "Personal")
    select c;
}

Con este ejemplo lo que logramos es leer el fichero XMLContactos.xml” y realizar diferentes consultas LINQ filtrando por determinados criterios.

Nota: Iré colocando otros ejemplos Linq to XML en este mismo post a medida que se me vallan presentando las ocasiones de hacerlo.

 

Artículos Relacionados: