jueves, 21 de abril de 2016

Receta C# No. 6-7: Cómo Leer y Escribir XML sin Cargar el Documento Entero en Memoria

Índice

1. Introducción
2. Palabras Clave
3. Problema
4. Solución
5. Discusión de la Solución
5.1 Clase XmlReader
5.2 Clase XmlWriter
6. Práctica: Lectura y Escritura de un Documento XML con XmlReader y XmlWriter
7. Conclusiones
8. Literatura & Enlaces

1. Introducción

En esta nueva receta se demuestra cómo leer y escribir sobre un documento XML sin necesidad de cargar todo el documento sobre la memoria. El propósito es escribir código de manipulación XML más eficiente: en términos de uso de los recursos de cómputo -espacio de memoria-. Para esto se hace uso de clases alternativas a XmlDocument: XmlReader y XmlWriter.

2. Palabras Clave

  • Caché
  • Documento
  • Memoria
  • Nodo
  • XML

3. Problema

Leer y escribir en un documento XML usando un flujo de entrada y salida. Además, la lectura y escritura de un nodo debe realizarse de manera serializada: uno a la vez; esto con el propósito de hacer más eficiente el uso de memoria.

4. Solución

En la BCL se cuenta con las clases XmlReader y XmlWriter para solucionar este problema de uso de memoria: carga completa del documento XML en memoria.

5. Discusión de la Solución

5.1 Clase XmlReader

La clase abstracta XmlReader (namespace System.Xml) lee un documento XML nodo a nodo. Cuenta con un mecanismo para la lectura rápida, no requiere caché y la lectura sólo hacia adelante ("XmlReader Class", 2016). Además, la lectura de los nodos se hace de manera directa desde el flujo de entrada y salida. Este modo de funcionamiento recae en un mejor rendimiento, dado que el uso de memoria es inferior respecto al demandado por la clase XmlDocument. Sin embargo, hay que considerar que no cuenta con el mecanismo de navegabilidad que XmlDocument sí provee: recorrer el documento XML de acuerdo a filtros de búsqueda, por ejemplo.

XmlReader cuenta con métodos ReadX para leer el contenido del documento XML con diferentes tipos de datos y/o en modo sincrónico o asincrónico. 

5.2 Clase XmlWriter

Con XmlWriter ("XmlWriter Class", 2016) se escribe sobre un documento XML usando directamente un flujo de entrada y salida. Posee las mismas propiedades que XmlWriter:
  • escritura sin requerir caché, 
  • escritura sólo hacia adelante, 
  • escritura rápida.
Cuenta con métodos WriteX ("XmlWriter Class", 2016) para escritura asincrónica de elementos, atributos y valores de diferentes tipos de datos.

Con el método static Create() se crea un documento XML especificando una cadena de caracteres con el nombre del archivo:

XmlWriter xmlWriterDoc = XmlWriter.Create("literatura-2016.xml");

6. Práctica: Lectura y Escritura de un Documento XML con XmlReader y XmlWriter

En este código de ejemplo en C# (adaptado de Jones (2010)) se crea una aplicación de consola para leer y escribir un documento XML.

Con las líneas 13 y 14 se crea un documento XML llamado productos.xml. Con la instrucción de la línea 17 se inicia la escritura del documento. El primer elemento de este documento se nombrará como Productos. A partir de este elemento se anidan otros para referenciar cada producto del catálogo de productos; esto se lleva a cabo con la creación de dos elementos en las líneas 23-34.

El documento XML recién creado y con nuevos elementos se cierra con las instrucciones de las líneas 37-40.

Para la apertura del archivo se usa una instancia de FileStream (línea 47) y se pasa como argumento al método static Create() (línea 48). Con el ciclo while (líneas 51-71) se leen los nodos del documento XML: elementos, atributos y valores.

Compilación: 

csc /t:exe LecturaEscrituraXml.cs

Ejecución assembly

.\LecturaEscrituraXml.exe

Prueba ejecución assembly
Ejecución assembly LecturaEscrituraXml.exe

7. Conclusiones

En esta receta se ha comprendido cómo usar las clases XmlReader y XmlWriter para la lectura y escritura eficiente de un documento XML: a diferencia de XmlDocument estas clases no cargan el documento en memoria, con lo cual se disminuye considerablemente el espacio requerido en memoria.

8. Literatura & Enlaces

Jones, A., Freeman (2010). Visual C# 2010 Recipes: A Problem-Solution Approach. United States: Apress.
XmlReader Class (System.Xml) (2016, abril 21). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlreader.aspx
XmlWriter Class (System.Xml) (2016, abril 21). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter(v=vs.110).aspx


V

No hay comentarios:

Publicar un comentario

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