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

No hay comentarios:

Publicar un comentario

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