lunes, 13 de julio de 2015

XML con C# (C1A8): .NET y XML

Índice

0. Introducción
1. Microsoft NET y XML
2. XML y BCL
2.1 Assemblies
2.2 Namespaces sobresalientes
2.2.1 System.Xml
2.2.2 System.Xml.Schema
2.2.3 System.Xml.XPath
2.2.4 System.Xml.Xls
2.2.5 System.Xml.Serialization
2.2.6 System.Xml.Linq
3. Modelos de Parseo de XML en Microsoft .NET Framework
4. Modelo de Parseo Basado en LINQ
5. Archivos de Configuración de .NET
6. ADO.NET
7. Controles de servidor ASP.NET
8. Serialización XML
9. Interacción Remota (Remoting)
10. Servicios Web
11. Documentación XML
12. Conclusiones
13. Glosario
14. Literatura & Enlaces

0. Introducción

En este octavo artículo del primer capítulo de XML con C# vamos a abordar varios de los temas que relacionan este lenguaje de marcado, XML, con la plataforma de Microsoft .NET Framework. Enlistaremos y describiremos cada uno de los elementos que relacionan estas dos tecnologías: serialización, servicios Web, parseo y transformación de XML, controles de servidor ASP.NET, configuración de .NET, entre otros más. Incluiremos una serie de ejemplos para demostrar la utilidad de las aplicaciones de XML y las herramientas que ofrece .NET para el programador.

1. Microsoft .NET y XML

La BCL de Microsoft .NET Framework cuenta con cientos de clases que posibilitan escribir aplicaciones para el tratamiento de datos representandos en XML. En [1] nos presentan la siguiente lista de aplicaciones que trataremos de describir en las siguientes secciones:
  • Archivos de configuración de .NET
  • ADO.NET
  • Controles de servidor ASP.NET
  • Serialización XML
  • Interacción remota (remoting)
  • Servicios Web
  • Documentación basada en XML
  • Capacidades de procesamiento XML de SQL Server
  • Parseo, y 
  • Transformación XML.

2. XML en la BCL

2.1 Asssemblies

Todas las clases que prestan servicios para el tratamiento de datos representandos en XML están localizadas en el assembly System.Xml.dll. Existen otros assemblies localizados en archivos independientes, como:
  • System.Xml.Linq.dll
  • System.Xml.ReaderWriter.dll
  • System.Xml.Serialization.dll
  • System.Xml.XDocument.dll, y 
  • System.Xml.XmlSerializer.dll.
Por ejemplo en el caso de System.Xml.Linq.dll, ofrece clases para usar las capacidades de consulta de LINQ.

2.2 Namespaces sobresalientes

2.2.1 System.Xml

El namespace System.Xml [4] es considerado el nombre de espacio más importante para el tratamiento de XML, ya que ofrece clases para la escritura y lectura de documentos basados en este lenguaje de marcado. Ejemplos de clases:
  • XmlDocument [5]: Representación de un documento XML.
  • XmlTextReader [6] y XmlTextWriter [7]: clases para la lectura y escritura de documentos XML.
  • XmlNode, XmlElement, XmlAttribute, y XmlText:  Clases para referir a los diferentes elementos estructurales de un documento XML:
    • Nodo,
    • Elemento, 
    • Atributo, y
    • Texto.

2.2.2 System.Xml.Schema

En System.Xml.Schema [8] residen las clases que permiten al programador trabajar con esquemas (schemas). Estos schemas XML [9] no son más que la descripción de un tipo de documento XML.

Clases sobresalientes de este namespace:
  • XmlSchema
  • XmlSchemaElement
  • XmlSchemaComplexType.

2.2.3 System.Xml.XPath

En este nombre de espacio, System.Xml.XPath [10], están definidas clases para el uso de las capacidades de consulta y edición de XPath [11] sobre XML.

Clases sobresalientes de este namespace:
  • XPathDocument
  • XPathExpression
  • XPathNavigator, y 
  • XPathNodeIterator.

2.2.4 System.Xml.Xsl

En el namespace System.Xml.Xsl hallamos los elementos de programa para llevar a cabo transformaciones con XSLT (XML con C# (C1A5): Transformación y Representación de Datos). Entre las clases disponibles tenemos:
  • XslCompiledTransform
  • XslTransform
  • XsltSettings.

2.2.5 System.Xml.Serialization

Las clases necesarias y útiles para la serialización y deserialización de objetos en y desde formato XML residen en el namespace System.Xml.Serialization [14]. Algunas clases de este namespace:
  • XmlSerializer
  • XmlAttributeAttribute, 
  • XmlRootAttribute, y 
  • XmlTextAttribute.

2.2.6 System.Xml.Linq

Otro de los namespace importantes en System.Xml es System.Xml.Linq. En este namespace encontramos varias de las clases necesarias para el uso de LINQ sobre documentos XML. Es decir que podemos crear consultas de forma flexible como si tratará de un lenguaje declarativo (e.g., SQL).

3. Modelos de Parseo de XML en Microsoft .NET Framework

En .NET contamos con dos modelos de parseo (parsing) de XML:
  • DOM o basado en estructura arbórea. Clases relevantes en este modelo:
    • XmlDocument: Carga, lectura, y modificación de documentos XML.
  • Modelo lector. Clases relevantes en este modelo:
    • XmlReader
    • XmlWriter
Se sabe que otro de los modelos clásicos para el parseo de XML es SAX, sin embargo, .NET no cuenta con una implementación para este modelo. De todas maneras, como advierten en [1] el segundo modelo suple esa carencia con capacidades similares y más eficientes:
"You can think of reader-based parsers as an alternative to traditional SAX-based parsers."

4. Modelo de Parseo Basado en LINQ

Ya hemos mencionado que el namespace System.Xml.Linq provee clases para el uso de LINQ sobre documentos XML. Esto nos va a permitir crear consultas más familiares y naturales sobre la estructura de un documento XML.

[NotaLINQ además de soportar características para XML, facilita trabajar con objetos en memoria (LINQ to objects) o en registros en una base de datos (LINQ to ADO.NET).]

5. Archivos de Configuración de .NET

Desde la aparición de Microsoft .NET Framework las configuraciones de una aplicación (e.g., cadenas de conexión a una base de datos, rutas del sistema de archivos, esquemas de seguridad) son especificadas en documentos XML.

Previamente se usaban archivos .ini para este cometido, pero como se menciona en [1] las limitaciones en funcionalidad, los problemas de seguridad asociados con la residencia de configuración de aplicaciones en el registro de Wndows, carencia de APIs en VB6 para la interacción con el registro, etc., con el tiempo no resultaba viable, además de difícil uso y administración.

La solución desde la aparición de .NET fue usar un enfoque estandarizado y fácil de implementar para las aplicaciones escritas bajo esta plataforma. Las ventajas que presenta este enfoque son [1]:
  • Almacenamiento de configuración en modo estructurado y legible.
  • Lectura de la configuración a través de clases disponibles en el mismo framework.
  • Fácil despliegue de aplicaciones, pues se obvia la modificación del registro de Windows.
  • Personalización del archivo de configuración con etiquetas requeridas.
  • Encriptación de los documentos XML.
En [1] se menciona, además, los tres tipos de archivos de configuración disponibles en Microsoft .NET Framework:
  • archivos de configuración de aplicación, 
  • archivos de configuración de máquina, y 
  • archivos de configuración de seguridad.
A continuación un ejemplo del archivo de configuración de una aplicación basada en Windows Forms:

Archivo XML App.config [Enlace alternativo]:

Otro ejemplo de un archivo de configuración, pero de un aplicación ASP.NET:

Archivo XML Web.config [Enlace alternativo]:



Por otra parte, la instalación de .NET Framework crea un archivo llamado machine.config. Este archivo contiene configuración global para todas la aplicaciones .NET creadas en la máquina donde se haya instalado .NET Framework. Sin embargo, como se manifiesta en [1] es posible modificar esta configuración por aplicación si resulta necesario. En la versión 4.0.30319 este archivo se halla en:


C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config

6. ADO.NET

ADO.NET [15] (como veremos más detenidamente en futuros capítulos: recetas, artículos) permite el trabajo con acceso a datos desconectados; para lo lograr este modo de operación, en .NET contamos con una clase llamada DataSet [16]. La representación interna de un objeto de esta clase es un documento XML, el cual proporciona mecanismos para la manipulación de datos, comunicación entre distintos sistemas, etc. [1]

Por otro lado, contamos con clases como XmlDataDocument que permite el trabajo con datos relacionales o basados XML usando el estilo estructural de DOM [1].

7. Controles de servidor ASP.NET

ASP.NET [17] (la tecnología para la escritura de aplicaciones y sitios Web modernos) usa XML para la representación de controles de servidor. Estos controles, permiten ser manipulados programáticamente del lado del servidor. Para demostrar su representación, veamos este archivo de código que mezcla HTML y controles de servidor ASP.NET:


En la línea 15 vemos la definición de un control para la representación de una etiqueta. Esta es la forma en ASP.NET que permite definir controles siguiendo marcas similares a las de HTML, pero que al respaldo sigue un vocabulario de XML y sus reglas.

8. Serialización XML

En una arquitectura basada en cliente servidor como la que se presenta en la Figura 1 [1], existen diferentes capas que distribuyen la aplicación en diferentes servidores con tareas especializadas:
  • Presentación, 
  • Lógica de negocio, y 
  • Acceso a datos.
Aplicación distribuida
Figura 1. Aplicación distribuida [1].
En este tipo de escenario el intercambio de datos se lleva a cabo a través de un proceso que se conoce como serialización (serialization). Este proceso se aplica tanto a las solicitudes realizadas desde los equipos clientes como de las respuestas generadas desde los servidores hacia el cliente. En el caso de la serialización XML, los datos se serializan en formato XML desde el servidor, luego el cliente debe ser capaz de deserializar este representación para su posterior tratamiento.

9. Interacción Remota (Remoting)

En la Figura 1 las distintas capas de la aplicación se comunican usando un mecanismo conocido como interacción remota (remoting). .NET remoting provee la infraestructura para el diseño de aplicaciones distribuidas. Estas aplicaciones pueden estar desplegadas en una red de área local e inclusive en Internet (para este caso, como se sugiere en [1], resulta más apto usar servicios Web).

Podemos añadir la nota dada en [1]:
"You can think of remoting as a replacement for Distributed Component Object Model (DCOM) under .NET."
Los componentes integrales que interactúan en este ambiente serializan y deserializan datos ya sea en formato binario o en formato XML. En este último caso, podemos recurrir como ejemplo la serialización y deserialización de la configuración de la aplicación.

10. Servicios Web

Los servicios Web son el pilar de las aplicaciones distribuidas y/o multiplataforma. Estos servicios Web se pueden concebir como un modo estándar de comunicación para la interacción entre clientes y un servidor. Podemos escribir una aplicación Web, un aplicación de escritorio, una aplicación móvil, etc. simplemente consumiendo un el conjunto de funcionalidad que ofrece un servicio Web. Para el servicio Web es independiente el tipo de aplicación cliente que utiliza su API de servicios.

Esta transparencia de consumo que ofrece un servicio Web es lograda gracias a su naturaleza de diseño y las tecnologías bajo las que funciona: HTML, XML, y SOAP. Gracias a también al esfuerzo de las grandes industrias y organizaciones (e.g., W3C) por crear, mantener, y revisar los estándares Web como lo es XML.

11. Documentación XML

El trabajo de un programador no es sólo escribir buen código, sino además escribir código claramente documentado que facilite futuras revisiones, actualizaciones por el mismo programador, por el equipo de desarrollo, o en una eventual agregación de nuevo personal de programación. Gracias a XML los programadores de C#, tienen a su alcance la escritura de documentación XML embebida en el código. Por ejemplo:

///
/// Recupera y modifica el valor textual del número de una silla.
///
public int NumeroSilla
{
    get
    {
        return m_numeroSilla;
    }
    set
    {
        m_numeroSilla = value;
    }
}

Las tres primeras líneas son código de documentación XML. Esta documentación describe brevemente la funcionalidad del código C# que viene a continuación: la propiedad NumeroSilla. Notemos que la documentación empieza con el uso de tres barras crecientes: ///.

12. Características XML de SQL Server

En SQL Server existen varias extensiones que permiten a una sentencia SELECT retornar datos en formato XML:
  • FOR XML
  • AUTO
  • EXPLICIT
  • PATH, y 
  • RAW
(En futuros artículos y recetas trabajaremos sobre estos elementos de programa para comprender su uso y utilidad.)

13. Conclusiones

Hemos explorado la fuerte relación que existe entre XML y Microsoft .NET Framework. Hemos distinguido los diferentes namespaces para el tratamiento de XML en diferentes aplicaciones: XSLT, controles de servidor ASP.NET, bases de datos SQL Server, servicios Web, archivos de configuración de máquina, servidor, y seguridad, entre otras más. Saber y comprender el abánico de herramientas XML que .NET ofrece, nos permitirá afrontar problemas y diseños complejos en aplicaciones de gran envergadura o de requerimientos sofisticados.


Con el próximo artículo de XML con C# empezaremos a manipular documentos XML usando DOM.

14. Glosario

  • .NET
  • ADO.NET
  • API
  • Aplicación distribuida
  • Cliente
  • Interacción remota
  • LAN
  • LINQ
  • Parseo
  • Parsing
  • Remoting
  • Schema
  • Serialización
  • Servidor
  • SQL
  • SQL Server
  • XML

15. Literatura & Enlaces

[1]: Beginning XML with C# 2008 From Novice to Professional by Bipin Joshi. Copyright 2008 Bipin Joshi, 978-1-4302-0998-0.
[2]: XML - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/XML
[3]: Language Integrated Query - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/Language_Integrated_Query
[4]: System.Xml Namespace () - https://msdn.microsoft.com/en-us/library/System.Xml(v=vs.110).aspx
[5]: XmlDocument Class (System.Xml) - https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx
[6]: XmlTextReader Class (System.Xml) - https://msdn.microsoft.com/en-us/library/system.xml.xmltextreader(v=vs.110).aspx
[7]: XmlTextWriter Class (System.Xml) - https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter(v=vs.110).aspx
[8]: System.Xml.Schema Namespace () - https://msdn.microsoft.com/en-us/library/system.xml.schema(v=vs.110).aspx
[9]: XML schema, the free encyclopedia - https://en.wikipedia.org/wiki/XML_schema
[10]: System.Xml.XPath Namespace () - https://msdn.microsoft.com/en-us/library/system.xml.xpath(v=vs.110).aspx
[11]: XPath - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/XPath
[12]: System.Xml.Xsl Namespace () - https://msdn.microsoft.com/en-us/library/system.xml.xsl(v=vs.110).aspx
[13]: XML con C# (C1A5): Transformación y Representación de Datos - http://ortizol.blogspot.com/2014/09/xml-con-csharp-c1a5-transformacion-y-representacion-de-datos-xlst.html
[14]: System.Xml.Serialization Namespace () - https://msdn.microsoft.com/en-us/library/system.xml.serialization(v=vs.110).aspx
[15]: ADO.NET - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/ADO.NET
[16]: DataSet Class (System.Data) - https://msdn.microsoft.com/en-us/library/system.data.dataset(v=vs.110).aspx
[17]: ASP.NET - Wikipedia, the free encyclopedia - https://en.wikipedia.org/wiki/ASP.NET


J

No hay comentarios:

Publicar un comentario

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