LINQ a XML

Dejadme que os hable un poco de Linq a XML porque Linq es un tipo de lenguaje que personalmente me gusta mucho y creo que siempre estoy hablando de el para acceder a base de datos pero nunca para acceder a documentos XML.

Hasta el Framework 3.5 SP1 para poder trabajar con documentos XML utilizabas la clase System.Xml.XmlDocument que construía en memoria una representación del archivo en modo de árbol. Este árbol tenía sus nodos – clase XmlNode – que podían ser de distintos tipos – System.Xml.XmlElement, Sys-tem.Xml.XmlText, System.Xml.XmlAttribute, … -. La forma de trabajar de estas clases no era compleja – pues para realizar una búsqueda de un nodo o atributo dentro de esta estructura usabas XPath – pero si que complicaba un poco el construir la estructura en si.

Linq a Xml permite ejecutar consultas Linq en estructuras XML, que al igual, residen en memoria y trabajan bien con XPath pero con operadores específicos que permiten la navegación – Descendants, Ancestors, Siblings – como si fuera una expresión XPath.

Las clases que se utilizan en Linq a Xml son System.Xml.Linq.XDocument, System.Xml.Linq.XElement y System.Xml.Linq.XAttribute, System.Xml.Linq.XName y algunos otros más.

Las claves

Linq a Xml permite cargar documentos XML desde ficheros o directamente desde cadenas de texto con formato y permite a su vez serializar el contenido a ficheros o stream. La creación de los arboles XML en memoria se hacen de una forma simple y rápida. La manipulación de la estructura es en memoria y soporta las consultas Linq.

XElement y XAttribute

Los elementos y los atributos están representados por estas dos clases XElement y XAttribute usando una sintaxis muy natural para poder construir los nodos. Los constructores utilizan XName como parámetro que implícitamente se crea con una cadena de texto. XName provee de un fácil uso de los identificadores del espacio de nombres.

En el siguiente ejemplo ves como crear la estructura XML

<br /><br />&lt;Person KeenOnGolf=”true”&gt;<br /><br />&lt;Name&gt;Steve&lt;/Name&gt;<br /><br />&lt;Age&gt;52&lt;/Age&gt;<br /><br />&lt;/Person&gt;<br /><br />

es

C#

<br /><br />var e = new XElement("Person",<br /><br />new XAttribute("KeenOnGolf", true),<br /><br />new XElement("Name", "Steve"),<br /><br />new XElement("Age", 52));<br /><br />

Los elementos XML se pueden construir de otras formas:

Usando un XmlReader

<br /><br />var e1 = XElement.Load(xmlReader);<br /><br />

Usando un fichero

<br /><br />var e2 = XElement.Load(@"c:\miDocumento.xml");<br /><br />

Usando una cadena de texto

<br /><br />var e3 = XElement.Parse(@"&lt;Person KeenOnGolf='true'&gt;<br /><br />&lt;Name&gt;Steve&lt;/Name&gt;<br /><br />&lt;Age&gt;52&lt;/Age&gt;<br /><br />&lt;/Person&gt;");<br /><br />

Aplicando Linq a XElement

Cuando aplicas consultas Linq a este tipo de estructuras el resultado es un IEnumerable de XElement. El trato debe ser el mismo que en colecciones internas con la particularidad de que aquí estás tratando con elemento de tipo XElement.

El siguiente ejemplo se muestra como recuperar la persona que es aficionado al golf (KeenOnGolf a true). Para ello se utiliza una estructura XML definida como:

<br /><br />var people = new XElement("Persons",<br /><br />new XElement("Person",<br /><br />new XAttribute("KeenOnGolf", true),<br /><br />new XElement("Name", "Steve"),<br /><br />new XElement("Age", 52)),<br /><br />new XElement("Person",<br /><br />new XAttribute("KeenOnGolf", false),<br /><br />new XElement("Name", "Peter"),<br /><br />new XElement("Age", 30)),<br /><br />new XElement("Person",<br /><br />new XAttribute("KeenOnGolf", false),<br /><br />new XElement("Name", "John"),<br /><br />new XElement("Age", 44)),<br /><br />new XElement("Person",<br /><br />new XAttribute("KeenOnGolf", false),<br /><br />new XElement("Name", "Mike"),<br /><br />new XElement("Age", 50))<br /><br />);<br /><br />

La consulta Linq seria:

<br /><br />var query= from p in people.Elements("Person")<br /><br />where bool.Parse(p.Attribute("KeenOnGolf").Value)==true<br /><br />select p; foreach (XElement person in query) {<br /><br />}<br /><br />

Construyendo elementos XML De la misma forma que puedes consultar los valores de los elementos de una estructura en XML también puedes crear nuevas estructuras usando Linq. Este es una de las características que ya he hablado en este libro de Linq – permitir crear estructuras nuevas a partir de otras en una consulta -. Así pues en el ejemplo siguiente ves como puedes crear otros elementos XElement.

<br /><br />var query2 = from p in people.Elements("Person")<br /><br />where bool.Parse(p.Attribute("KeenOnGolf").Value) == false<br /><br />select new Xelement("PersonsNonKeen",<br /><br />new Xelement("Name",p.Element("Name").Value),<br /><br />new XElement("Age",p.Element("Age").Value));<br /><br />foreach (XElement person in query2) {}<br /><br />

El resultado seria la estructura siguiente:

<br /><br />&lt;PersonsNonKeen&gt;<br /><br />&lt;Person KeenOnGolf=”false”&gt;<br /><br />&lt;Name&gt;Peter&lt;/Name&gt;<br /><br />&lt;Age&gt;30&lt;/Age&gt;<br /><br />&lt;/Person&gt;<br /><br />&lt;Person KeenOnGolf=”false”&gt;<br /><br />&lt;Name&gt;John&lt;/Name&gt;<br /><br />&lt;Age&gt;44&lt;/Age&gt;<br /><br />&lt;/Person&gt;<br /><br />&lt;Person KeenOnGolf=”false”&gt;<br /><br />&lt;Name&gt;Mike&lt;/Name&gt;<br /><br />&lt;Age&gt;50&lt;/Age&gt;<br /><br />&lt;/Person&gt;<br /><br />&lt;/PersonsNonKeen&gt;<br /><br />

Más información

Para más información puedes comprar mi libro Guia Práctica de Asp.net

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

S'està connectant a %s