martes, 14 de junio de 2016

Receta C# No. 6-14: Crear un Árbol XML con LINQ

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Constructores de XElement
5.2 Método Add
6. Práctica: Creación de un Árbol XML con LINQ
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Con esta nueva receta C# el programador explora los aspectos programáticos para crear un nuevo árbol XML usando varias de las construcciones de creación de elementos, atributos, datos; todos disponibles a través de las distintas clases del namespace System.Xml.Linq. El aspecto de aprendizaje principal en esta receta es usar LINQ para estructurar el documento XML a través de código. La sección práctica describe cómo crear la estructura del documento XML CatalogoProductos.xml estudiado en recetas previas.

2. Palabras Clave

  • Árbol XML
  • Atributo
  • Elemento
  • LINQ
  • XML

3. Problema

Crear un árbol XML usando el lenguaje de consulta integrado LINQ.

4. Solución

A través de una de las versiones sobrecargadas del constructor de la clase XElement se puede construir un árbol XML con elementos y atributos.

5. Discusión de la Solución

5.1 Constructores de XElement


La clase XElement ("XElement Class", 2016) posee las siguientes versiones sobrecargadas de su constructor ("XElement Constructor", 2016)
Constructores de XElement
Figura 1. Constructores de XElement ("XElement Constructor", 2016).
La versión XElement(XName, Object[]) es la sobrecarga que se utilizará en la sección práctica, y es la que permite incluir el nombre del elemento raíz -XName- junto con un arreglo de objetos -Object[]- que puede contener atributos y otros elementos de la estructura global del documento.

Por ejemplo, se puede escribir 

XElement elementoRaiz = new XElement("nodoRaiz",
new XAttribute("primerAtributo", "primerValorAtributo"),
new XAttribute("segundoAtributo", "segundoValorAtributo"),
new XElement("primerElemento", "valorPrimerElemento"),
new XElement("segundoElemento", "valorSegundoElemento",
new XAttribute("atributoAnidado", "valorAtributoAnidado"))
);

Este modo de construir un árbol XML sigue el mismo enfoque de creación de un documento XML: por ejemplo se puede crear un elemento con atributos y otros elementos anidados. Evidentemente construir un objeto a nivel programático puede resultar tedioso, dado que se podría cometer un error, por ejemplo de anidación, y generar una estructura que no sigue una especificación en particular. Con práctica y persistencia todo objetivo es posible.

El código escrito anteriormente forma un árbol XML como el siguiente:

<nodoRaiz primerAtributo="valorPrimerAtributo" segundoAtributo="valorSegundoAtributo">
<primerElemento>valorPrimerElemento</primerElemento>
<segundoElemento atributoAnidado="valorAtributoAnidado">valorSegundoElemento</segundoElemento>
</nodoRaiz>

5.2 Método Add

Con el método sobrecargado Add ("Xelement.Add Method", 2016) se puede usar LINQ para la agregación de contenido anidado sobre elemento raíz XElement. Entre los tipos permitidos de adición se hallan:
  • XAttribute
  • XElement
  • XComment
  • XDeclaration, y 
  • XCData

6. Práctica: Creación de un Árbol XML con LINQ

En el ejemplo que viene a continuación se usan los dos enfoques presentados en la sección teórica previa. Esto con el propósito de demostrar las capacidades de LINQ sobre el estándar XML.

Las líneas 12-20 crea el elemento raíz -Productos-, y enseguida se agrega un elemento tipo Producto con estas características:
  • ID
  • NombreProducto
  • Descripcion
  • Precio, y 
  • Disponible
Esta primera parte del código aplica el enfoque basado en constructor -el explicado en el sección de discusión 5.1.

Más adelante, en las líneas 23-28, se usa el método sobrecargado Add de XElement para permitir la agregación progresiva de elementos y atributos al elemento Producto creado en la línea 23Con la línea 30 se agrega este último elemento a la estructura arbórea del elemento raíz Productos.

Antes de finalizar, sobre las líneas 32-35 se crea el documento XML con la especificación declarativa de la versión del documento.

Compilación: 

csc /t:exe CreacionArbolXml.cs

Ejecución assembly

.\CreacionArbolXml.exe

> Prueba de ejecución assembly
Ejecución assembly CreacionArbolXml.exe
Figura 1. Ejecución assembly CreacionArbolXml.exe.
La salida del árbol construido con los elementos de programa contenidos en el namespace System.Xml.Linq se contrasta con la estructura formada en el documento XML CatalogoProductos.xml.

7. Conclusiones

Se comprendió cómo a través de elementos de programa del namespace System.Xml.Linq es posible construir un árbol XML con elementos declarativos, de objetos, y atributos. Se exploraron dos enfoques programáticos prácticos para la constitución de la jerarquía de un documento de este formato estándar.

La siguiente receta será aún más interesante: se usará LINQ para consultar por el contenido de un documento XML.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.
XElement Class (System.Xml.Linq) (2016, junio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspx
XElement Constructor (System.Xml.Linq) (2016, junio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/bb358354(v=vs.110).aspx
XElement.Add Method (System.Xml.Linq) (2016, junio 14). Recuperado desde: https://msdn.microsoft.com/en-us/library/Bb551367(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.