Mostrando entradas con la etiqueta XML. Mostrar todas las entradas
Mostrando entradas con la etiqueta XML. Mostrar todas las entradas

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

miércoles, 15 de junio de 2016

Receta C# No. 6-15: Consultar 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 de un árbol XML
5.2 Modos de consulta
5.2.1 Uso de operadores de consulta estándar
5.2.2 Uso de métodos de instancia
6. Práctica: Consulta de Productos de una Tienda con LINQ
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

Después de haber conocido y entendido cómo a través de LINQ es posible cargar y construir un documento XML a través de los elementos de programa disponibles en el namespace System.Xml.Linq, ahora en esta penúltima receta se usarán dos mecanismos distintos para realizar una selección sobre el contenido de un documento XML: uso de operadores de consulta estándar de LINQ y métodos de instancia.

2. Palabras Clave

  • Consulta
  • LINQ
  • Método de instancia
  • Operador de consulta estándar
  • XML

3. Problema

Usar LINQ para consultar por elementos y datos de un árbol XML.

4. Solución

Existen dos enfoques para realizar una consulta sobre un árbol XML
  • Uso de operadores de consulta estándar, e 
  • Invocación de métodos de instancia

5. Discusión de la Solución

5.1 Consulta de un árbol XML

En primer lugar, un objeto de la clase XElement (namespace System.Xml.Linq) constituye una fuente de datos permitida para efectuar una consulta LINQ sobre un árbol XML. El ciclo de pasos básicos requerido para este operación LINQ es como sigue (Freeman, 2016):
  1. Iniciar la consulta a través del operador estándar from, con el que se principia la determinación del contenedor de los datos: from elemento in elementoRaiz.Elements().
  2. Usar el operador estándar where para especificar un predicado de selección sobre los elementos.
  3. A través de select seleccionar los valores que pasaron la prueba del predicado.
  4. Determinar el modo de selección -ascendente o descendente- a través de orderby.

5.2 Modos de consulta

5.2.1 Uso de operadores de consulta estándar

Con los operadores de consulta estándar de LINQuna consulta análoga a SQL puede ser efectuada. Por ejemplo, para recuperar todos los elementos de un árbol XML cuyo atributo color es igual a azul se escribe esta sentencia:

from elemento in elementoRaiz.Elements() where (string)elemento.Attribute("color") == "azul"


Nótese cómo se usa el operador de consulta estándar from para referirse a todos los elementos de un elemento raíz referenciado como elementoRaiz. Luego con where se se escribe el predicado de igualdad de valores: (string)elemento.Attribute("color") == "azul".

5.2.2 Uso de métodos de instancia

Con los métodos de instancia se puede efectuar la consulta anterior recurriendo a invocaciones sobre instancias que representan un árbol XML:

elementoRaiz.Elements().Where(elemento => (string)elemento.Attribute("color") == "azul").Select(elemento => elemento);

6. Práctica: Consulta de Productos de una Tienda con LINQ

En este ejemplo se recurre al archivo XML store.xml que contiene información acerca de productos de una tienda (Freeman, 2010).

Archivo XML store.xml [Enlace alternativo]: 


A continuación se escribe una aplicación basada en consola para realizar consultas con LINQ recurriendo a los dos enfoques explicados en la sección 6.2.

Archivo C# ConsultaLinqSobreXml.xml [Enlace alternativo][Enlace alternativo]:



En las líneas 19-24 se utilizan los operadores de consulta estándar:
  • la primera parte consiste en especificar a través de from la fuente de datos a consultar -elementoRaiz.Elements-
  • luego a través de where se especifica en el predicado sobre los elementos consultados
  • finalmente con select se selecciona los datos de los elementos que cumplieron con la evaluación del predicado.
Con el ciclo foreach (líneas 28-31) se itera el objeto IEnumerable<string>: se muestra en la salida estándar todos los elementos obtenidos en la expresión anterior.

Más adelante, con las líneas 37-39, se realiza la misma consulta anterior pero a través de la invocación de métodos:
  • con la invocación elementoRaiz.Elements() se obtienen los elementos sobre los que se va a efectuar la consulta
  • con Where se establece el predicado compuesto por dos condiciones
Compilación: 

csc /t:exe ConsultaLinqSobreXml.cs

Ejecución assembly

.\ConsultaLinqSobreXml.exe

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

7. Conclusiones

Se demostró cómo a través de LINQ se pueden efectuar consultas sobre la estructura arbórea de un documento XML.

La siguiente receta, con la que termina esta serie de Procesamiento XML, presenta cómo modificar un documento XML con LINQ.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.

V

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