jueves, 16 de junio de 2016

Receta C# No. 6-16: Modificar 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 Consulta LINQ
5.2 Uso de métodos de XElement
6. Práctica: Modificación Documento CatalogoProductos.xml con LINQ
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Después de haber estudiado el proceso de creación y consulta de un árbol XML, ahora llega la oportunidad para que el programador aprenda a modificar esta estructura usando el lenguaje de consulta integrado LINQ. Esta última receta C# de serie Procesamiento XML demuestra cómo a través de varios de los elementos de programa de LINQ es posible alterar o modificar -agregar, reemplazar o eliminar elementos- un árbol XML.

2. Palabras Clave

  • Árbol XML
  • Elemento de programa
  • LINQ

3. Problema

Agregar, reemplazar o eliminar elementos de un árbol XML usando LINQ.

4. Solución

Para efectuar estas operaciones la clase XElement provee los métodos Add, Replace..., y Remove....

5. Discusión de la Solución

Existen dos alternativas que permiten al programador modificar un árbol XML:
  • consulta LINQ o
  • invocación de métodos de la clase XElement

5.1 Consulta LINQ

A través de una consulta LINQ como las estudiadas en Receta C# No. 6-15: Consultar un Árbol XML con LINQ, la estructura de un árbol XML puede ser alterada: cambio de valores de atributos, eliminación de un nodo completo, cambio de los valores textuales de un elemento, etc.

5.2 Uso métodos de XElement

La clase XElement ("XElement Class", 2016) cuenta con los métodos Add, variantes de Replace y de Remove. En el caso de estas últimas dos, las variantes permiten modificar anotaciones, atributos, nodos, objetos, entre otros.

6. Práctica: Modificación Documento CatalogoProductos.xml con LINQ

Con el siguiente ejemplo se demuestra: 
  • cómo seleccionar todos los elementos que tengan como nombre Producto y cambiar su ID
  • remover todos aquellos elementos que contengan la palabra "Café"
  • agregar un nuevo elemento al elemento Productos.
En primer lugar se enlista el documento XML con el contenido original para hacer la práctica de modificación.

Ahora se escribe el código C# para realizar las operaciones consideradas previamente.

Archivo C# ModificacionArbolXml.cs [Enlace alternativo][Enlace alternativo]: 

Con la línea 15 se carga el archivo XML CatalogoProductos.xml por medio del método static XElement.Load. Antes de realizar cualquier modificación sobre su estructura se imprime en la salida estándar su contenido original.


En las líneas 24-28 se efectúa una consulta LINQ para seleccionar todos aquellos elementos de tipo Producto. En seguida (líneas 31-38), con el ciclo foreach, se cambia el atributo ID a cada producto adicionando 1000 al valor actual. Nuevamente (línea 41) se imprime en pantalla el contenido del árbol XML.


Para remover los elementos Producto que contengan la palabra "Cafe", la expresión LINQ de las líneas 47-50 se encarga de esta tarea. Resta la ejecución del ciclo foreach para invocar el método Remove sobre cada uno de los elementos que pasaron la prueba anterior. Se imprime en la salida estándar el contenido actual del árbol: línea 57.


Para finalizar, se define un elemento nuevo (líneas 62-68) y se agrega al elemento raíz (línea 69).


Compilación: 

csc /t:exe ModificacionArbolXml.cs


Ejecución assembly

.\ModificacionArbolXml.exe


> Prueba ejecución assembly
Ejecución assembly ModificacionArbolXml.exe
Figura 1. Ejecución assembly ModificacionArbolXml.exe.

7. Conclusiones

Se comprendió cómo LINQ facilita de forma sencilla y directa la manipulación de un árbol XML usando varios métodos de adición, remoción y reemplazo de atributos, elementos, datos. Estas operaciones son de especial interés para aplicaciones de manipulación de este tipo de estructura que representan sus datos de usuario y aplicación de forma jerárquica y estandarizada.

La próxima serie -WinForms- se concentra en la elaboración de recetas C# relacionadas con el namespace System.Windows.Forms.

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 16). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

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