jueves, 3 de diciembre de 2015

Receta C# No. 6-3: Inserción Rápida de Nodos en un Documento XML

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Clase ayudante AyudanteXml
5.2 Clonación de un nodo
6. Práctica: Código C#
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Esta nueva receta C# enseña cómo el programador puede insertar nodos en un documento XML de forma más ágil. En la receta anterior se demostró cómo insertar un nodo usando los métodos directos que provee la clase XmlDocument; en esta oportunidad se muestra a través de una clase ayudante cómo realizar el mismo proceso escribiendo menos código sin dejar a un lado su legibilidad. Además, en breve, se demuestra cómo a través del mecanismo de clonación se puede efectuar una inserción rápida con un número inferior de líneas de código respecto al enfoque de la receta C# No. 6.2.

2. Palabras Clave

  • Atributo
  • Clase ayudante
  • Clonación
  • Documento XML
  • Elemento
  • Nodo
  • XML

3. Problema

Se requiere un enfoque programático más ágil para la inserción de nodos en un documento XML.

4. Solución

La solución consiste en la creación de una clase ayudante que contiene los métodos de agregación de un elemento y un atributo. (Una solución alternativa consiste en la clonación de un nodo existe, alterar sus valores, y agregarlo al documento XML usando los étodos de la clase XmlDocument).

5. Discusión de la Solución

5.1 Clase ayudante AyudanteHelper

En la receta Receta C# No. 6-2: Inserción de Nodos en un Documento XML se mostró cómo insertar elementos -nodos y atributos- en un documento XML usando dos de los métodos disponibles en la clase XmlDocument ("XmlDocument Class", 2015) -CreateElement y CreateAttribute-. A pesar de la abstracción que soporta el diseño de la clase XmlDocument para estas tareas, se puede optar aún por la escritura de una clase ayudante que simplifique los procesos de inserción de nodos y atributos de forma más ágil y sencilla.

Continuando, la clase AyudanteHelper que se diseña en la sección de práctica cuenta con métodos de alto nivel para soportar el requerimiento:
  • InsertarElemento y 
  • InsertarAtributo
Esta clase será usada por la clase cliente InsercionAgilNodos.

5.2 Clonación de un nodo

La clase XmlNode ("XmlNode Class", 2015) cuenta con el método CloneNode ("XmlNode.CloneNode Method", 2015) para crear una copia de un nodo. El parámetro de este método permite especificar si se copia el contenido anidado o no; para ello es necesario especificar true o false como argumento:

// Creación de un nuevo elemento a partir de uno existente:
producto = producto.CloneNode(true);

// Modificación de los valores del nodo recién clonado:
producto.Attributes[0].Value = "10002";
producto.ChildNodes[0].ChildNodes[0].Value = "Cappuccino";
producto.ChildNodes[1].ChildNodes[0].Value = "9500";

// Agrega el nuevo elemento:
productos.AppendChild(producto);

6. Práctica: Código C#

En primer lugar se escribe la clase AyudanteXml:

En las líneas 9-26 se especifica el método static AgregarElemento con los parámetros:
  • nodoPadre: referencia al nodo padre sobre el que se creará/agregará el nuevo nodo.
  • nombreEtiqueta: nombre para el nuevo nodo.
  • contenido: contenido textual para un nodo anidado al recién creado. (Opcional).
Más adelante -líneas 29-38-, se crea el método static AgregarAtributo para agregar un nuevo atributo al documento XML. Estos son sus parámetros:
  • nodoPadre: referencia al nodo padre sobre el que se creará el nuevo atributo.
  • nombreAtributo: nombre para el nuevo atributo.
  • contenido: contenido textual para el atributo recién creado.
Compilación:

csc /t:library AyudanteXml.cs

Las líneas de interés de este archivo son:
  • Líneas 22-25: crea un primer elemento y añade otros nodos y atributos usando los métodos AyudanteXml.AgregarElemento y AyudanteXml.AgregarAtributo. Estos operaciones se realizan para crear el producto con ID 10001.
  • Líneas 27-30: de manera análoga al caso anterior, estas líneas crean un producto con ID 10002.
Compilación: 

csc /t:exe /r:AyudanteXml.dll \InsercionAgilNodos.cs

Ejecución assembly:

.\InsercionAgilNodos.exe
Ejecución assembly InsercionAgilNodos.exe
Figura 1. Ejecución assembly InsercionAgilNodos.exe.

7. Conclusiones

Se comprendió el proceso de creación de una clase ayudante para agilizar el proceso de agregación de nodos y atributos a un documento XML. Es notable la diferencia respecto a la receta C# anterior: en este caso solo se requirió invocar los métodos de la clase ayudante en cuestión para especificar datos del nuevo elemento/atributo a crear en el documento XML. En la próxima receta C# se demostrará cómo buscar elementos en un documento XML a través de su nombre.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.
Receta C# No. 6-2: Inserción de Nodos en un Documento XML (2015, diciembre 3). Recuperado desde: http://ortizol.blogspot.com/2015/11/receta-csharp-no-6-2-insercion-de-nodos-en-un-documento-xml.html.
XmlDocument Class (System.Xml) (2015, diciembre 29). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx.
XmlNode Class (System.Xml) (2015, diciembre 29). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlnode(v=vs.110).aspx.
XmlNode.CloneNode Method (Boolean) (System.Xml) (2015, diciembre 3). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlnode.clonenode(v=vs.110).aspx.


V

No hay comentarios:

Publicar un comentario

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