22 marzo 2015

Tarea XML

XML es un formato universal para los datos en diferentes plataformas, y hay muchas empresas que trabajan con datos XML y envían y reciben datos a través de sistemas como archivos XML. Hay algunas operaciones que pueden ser hechas con los datos XML: validación de archivos XML a través de archivos XSD o DTD, transformación de datos XML con XSLT, consulta de datos de XML con XPath, y otras operaciones que son soportadas en muchas aplicaciones y lenguajes de programación de hoy en día.
La tarea XML de SSIS es una tarea poderosa que proporciona algunas de estas operaciones sobre los datos XML. En este ejercicio, traemos los datos de una tabla como XML, lo validamos en un archivo XSD, y luego lo transformamos con XSLT.

Alistarse

1.    Guarde el contenido de books.xml y books.xsd de esta dirección en archivos físicos: http://msdn.microsoft.com/en-us/library/ms762258(v=VS.85).aspx.
2.    Crear un nuevo archivo vacío en esta dirección: C:\SSIS\Control Flow\Archivos\xslt_result.xml.

Ejercicio

1.    Crear un nuevo proyecto SSIS y nómbrelo TareaXML.
2.    Crear una nueva variable de tipo String de alcance paquete; nómbrelo IsValid.
3.    Arrastre y suelte una Tarea XML desde la Toolbox SSIS en el Control Flow.
4.    Haga doble clic en la Tarea XML y abra el XML Task Editor.
5.    En la pestaña General establezca OperationType como Validate.
6.    Establezca SourceType como File Connection, y crear un nuevo administrador de conexión de archivo para el archivo books.xml en la propiedad Source.
7.    Establezca SaveOperationResult como True.
8.    En la sección OperationResult, establezca DestinationType como Variable, y establezca Destination como User::IsValid y OverwriteDestination como True.
9.    Establecer SecondOperandType como File Connection y crear un nuevo administrador de conexión de archivo para books.xsd en la propiedad SecondOperand.
10.  Verifique si la ValidationType es XSD, y verifique si sus ajustes coinciden con los de la siguiente captura de pantalla:
 
11.  Haga clic en OK y cierre la Tarea XML.
12.  Añadir una Tarea Script de la Toolbox SSIS en el Control Flow inmediatamente después de la Tarea XML y dele doble clic, escriba User::IsValid en la propiedad ReadOnlyVariables, y luego, haga clic en Edit Script y escriba una línea de código para MessageBox como son mostrados a continuación en el método Main() de los scripts:
public void Main()
{
MessageBox.Show(
string.Format("Validation Result: {0}",
Dts.Variables["User::IsValid"].Value));
   Dts.TaskResult = (int)ScriptResults.Success;
}
13.  Una la tarea XML con la tarea Script, con la flecha verde. Ejecute el paquete y verifique el valor del cuadro de mensaje; verá Validation Result: false.
14.  Crear un nuevo paquete y realizar todos los pasos del 2 al 12 de nuevo para este nuevo paquete, esta vez cambiar la conexión de archivo SecondOperand para que apunte al archivo books_new.xsd (este es un archivo modificado de books.xsd, se encuentra en la sección Funcionamiento más adelante).
15.  Ejecute el paquete de nuevo, y esta vez obtendrá Validation Result:true.
16.  Crear un nuevo paquete y nómbrelo XSLT.
17.  Arrastrar y soltar una Tarea XML de la Toolbox SSIS en el Control Flow. Haga doble clic en la Tarea XML y abra el XML Task Editor.
18.  Establecer la OperationType como XSLT.
19.  Establezca SourceType como File Connection y crear una conexión a books.xml en la propiedad Source.
20.  Establecer la SecondOperandType como File Connection y crear una conexión de archivo para el archivo books.xslt (este es un archivo que se encuentra en la sección Funcionamiento más adelante) en la propiedad SecondOperand.
21.  Establecer la SaveOperationResult como True. Bajo OperationResult, establezca la DestinationType como File Connection y crear una conexión de archivos para xslt_result.xml bajo la propiedad Destination; establecer la OverwriteDestination como True.
22.  Verifique todas las configuraciones con la siguiente captura de pantalla:
 
23.  Cerrar la Tarea XML y ejecutar el paquete. Después de ejecutar el paquete, verifique el contenido del archivo xslt_result.xml. Debería ver una versión transformada de los datos de books.xml en un nuevo estilo.

Funcionamiento

La Tarea XML proporciona operaciones amplias para datos XML. Para elegir qué hacer con la Tarea XML debemos establecer la propiedad OperationType.
Para los primeros trece pasos de este ejercicio utilizamos la Tarea XML para validar los datos XML sobre un archivo de estructura XSD. Para este ejemplo, establecemos la OperationType como Validate. Validate comprobará la validez de los datos XML sobre archivos de estructura XSD o  DTD.
Como XML es una forma estándar de almacenar los datos y es ampliamente utilizada en aplicaciones y lenguajes de programación, hay una necesidad de definir la sintaxis para los datos XML. Cuando almacenamos datos en una tabla de SQL Server, debemos obedecer las reglas definidas en el momento de diseñar la tabla que define la estructura de la tabla.
Podemos crear un archivo para la sintaxis y la estructura de datos XML. La estructura XML puede ser definida de tres maneras: DTD, XDR, y XSD. Cada una de estas formas tiene su propio formato para la definición de la estructura. Una explicación de la diferencia entre ellos está más allá del alcance de este post; puede leer más acerca de estos tipos y cómo utilizar sus métodos de validación en lenguajes .NET en http://support.microsoft.com/kb/307379.
La Tarea XML de SSIS soporta sólo DTD y XSD para validación. Podemos elegir el tipo de validación por la propiedad ValidationType en la ficha General del XML Task Editor.
También puede configurar la Tarea XML para fallar si la validación sobre el archivo de esquema (archivo DTD o XSD). Por ello conviene establecer FailOnValidationFail a True. Esta opción es False por defecto.
Cada operación en la Tarea XML necesita dos operandos; en las primeras doce partes de nuestro ejercicio utilizamos Validate, que necesita dos operandos; el primer operando es los datos XML y el segundo operando es su esquema.
Establecemos Source como la conexión de archivos books.xml, que obtiene datos XML desde el archivo books.xml, el primer operando en la Tarea XML.
Establecemos el segundo operando como una conexión de archivos que apunta al archivo XSD books.xsd.
Tanto el origen y el segundo operando pueden ser una File Connection, Variable, o Direct input.
El resultado de la Tarea XML en cada operación es diferente, pero en todos los casos el resultado puede guardarse en algún lugar. En este ejemplo, utilizamos una variable String llamada IsValid para almacenar el resultado de la Tarea XML. También establecemos las propiedades que almacenan resultados XML en la sección Output de la ficha General del XML Task Editor.
Después de describir las diferentes opciones en el XML Task Editor, es el momento para describir cómo el XML será validado sobre el XSD. Echemos un vistazo a los datos XML primero. Los datos del archivo books.xml es similar al siguiente:
<?xml version="1.0"?>
<x:books xmlns:x="urn:books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:books books.xsd">
   <book id="bk001">
<author>Hightower, Kim</author>
<title>The First Book</title>
<genre>Fiction</genre>
<price>44.95</price>
<pub_date>2000-10-01</pub_date>
<review>An amazing story of nothing.</review>
   </book>
   <book id="bk003">
<author>Nagata, Suanne</author>
<title>Becoming Somebody</title>
<genre>Biography</genre>
<review>A masterpiece of the fine art of gossiping.</review>
   </book>
   <book id="bk002">
<author>Oberg, Bruce</author>
<title>The Poet's First Poem</title>
<genre>Poem</genre>
<price>24.95</price>
<review>The least poetic poems of the decade.</review>
   </book>
</x:books>
Los datos XML contienen múltiples elementos de libros y cada elemento de libro tiene algunos sub-elementos, tales como autor, título, género, precio, fecha_pub, y revisión. Describir la estructura de XML está más allá del alcance de este post; puede leer más acerca de XML en http://www.w3schools.com/xml/default.asp.
El esquema para este XML está en el archivo books.xsd, y el esquema se ve así:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:books"
xmlns:bks="urn:books">
 <xsd:element name="books" type="bks:BooksForm"/>
 <xsd:complexType name="BooksForm">
   <xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="BookForm">
   <xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float" />
<xsd:element name="pub_date" type="xsd:date" />
<xsd:element name="review" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>
Como se puede ver en el XSD, la información de esquema es descrita. Cada elemento de libro consiste de un tipo de datos complejo, que contiene sub-elementos autor, título, género, precio, fecha_pub, y revisión, y el tipo de datos de cada elemento es definido en el atributo type.
Note que cuando minOccurs no está definido en un elemento, ese elemento será considerado como requerido. Esto significa que más allá de que todos los elementos deben existir para cada elemento de libro, y si uno de estos sub-elementos están faltando, la validación sobre esta XSD retornará False. Esto es el por qué la variable IsValid tenía un valor False en el paso 13.
Cambiamos el XSD en el paso 14 y creamos un nuevo archivo XSD llamado books_new.xsd. La información de esquema para este archivo aparece como sigue:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:books"
xmlns:bks="urn:books">
 <xsd:element name="books" type="bks:BooksForm"/>
 <xsd:complexType name="BooksForm">
   <xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
   </xsd:sequence>
 </xsd:complexType>
 <xsd:complexType name="BookForm">
   <xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price"
type="xsd:float" minOccurs="0" maxOccurs="unbounded" />
  <xsd:element name="pub_date"
type="xsd:date" minOccurs="0" maxOccurs="unbounded" />
  <xsd:element name="review" type="xsd:string"/>
   </xsd:sequence>
   <xsd:attribute name="id" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>
En este nuevo archivo de esquema note la parte en negrita para los sub-elementos price y pub_date. Definimos la minOccurs como 0; esto significa que price y pub_date serán elementos opcionales y que omitir estos sub-elementos no causarán al XML a fallar sobre la validación. Esta fue la razón por la cual la variable IsValid era True en el paso 15.
Desde el paso 16 empezamos otro ejemplo de una Tarea XML con la OperationType a XSLT.
XSLT significa eXtensible Stylesheet Language Transformation. XSLT es un lenguaje de hoja de estilo común, que proporciona una manera de transformar los datos XML existentes a un nuevo estilo. Esta operación es una manera muy útil para disminuir la complejidad de los datos XML. Si tratamos de leer los datos XML complejos con XML Source, vamos a obtener resultados extraños, y el XML Source a veces no resolverá estructuras de datos XML complejas. Aquí es donde la Tarea XML con la OperationType a XSLT entra en juego. Con XSLT simples podemos transformar el XML existente a datos XML más sencillos.
En este ejemplo, nuestro archivo books.xml es bastante simple y no hay necesidad de cambiarlo. Sin embargo, supongamos que queremos traer sólo las partes del autor y el título del XML y ellos tienen atributos en lugar de sub-elementos.
Así creamos el código XSLT para hacer esta transformación, la XLST en nuestro ejemplo luce así:
<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="urn:books"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="urn:books books.xsd">
  <xsl:output method="xml" indent="yes" version="2.0"
   encoding="UTF-8" />
  <xsl:template match="/">
    <xsl:element name="x:books">
      <xsl:for-each select="x:books/book">
        <xsl:element name="book">
          <xsl:attribute name="author">
            <xsl:value-of select="./author"/>
          </xsl:attribute>
          <xsl:attribute name="title">
           <xsl:value-of select="./title"/>
          </xsl:attribute>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
Los detalles de la sintaxis y el lenguaje XSLT están más allá del alcance de este post; puede aprender más sobre XSLT de http://www.w3schools.com/xsl/default.asp.
El resultado de aplicar este XSLT en los datos de books.xml (que ya está almacenada en xslt_result.xml) luce así:
<?xml version="1.0" encoding="utf-8"?>
<x:books xmlns:x="urn:books">
   <book author="Hightower, Kim" title="The First Book" />
   <book author="Nagata, Suanne" title="Becoming Somebody" />
   <book author="Oberg, Bruce" title="The Poet's First Poem" />
</x:books>
Cada libro es dividido en un elemento y los subelementos autor y título son transformados en atributos en la nueva estructura de datos XML.

Adicional

Hay más operaciones que la Tarea XML proporciona para trabajar con datos XML; vamos a explorar esas operaciones.
XPath
XPath es un lenguaje de consulta para XML. Podemos obtener los datos de XML con consultas XPath. La sintaxis y la estructura de consultas XPath pueden ser encontradas aquí: http://www.w3schools.com/xpath/default.asp.
Supongamos que queremos obtener el título de todos los nodos y crear un nuevo archivo con los nodos de título solamente. Así que trataremos de hacer esto con estos pasos:
1.    Arrastrar y soltar una nueva Tarea XML desde el Toolbox SSIS en el Control Flow, y en el editor XML, establecer la OperationType como XPath.
2.    Establecer Source como una File Connection a books.xml.
3.    Establecer SecondOperandType como Direct input, y establecer SecondOperand como x:books/book/title.
4.    En Namespaces añadir un elemento con un prefijo como x, y URI como urn:books.
5.    Establecer XPathOperation como Node list.
6.    Establecer las propiedades Output para guardar la salida al archivo xpath_result.txt.
7.    Confirmar todas sus configuraciones con esta captura de pantalla:
8.    Ejecute el paquete y verifique el archivo xpath_result.txt por los resultados; debería lucir como esto:
<title>The First Book</title>
<title>Becoming Somebody</title>
<title>The Poet's First Poem</title>
Merge
Con la operación Merge podemos fusionar dos archivos XML, el primer archivo XML será configurado en Source, y el segundo archivo será configurado en SecondOperand. La Tarea XML fusionará el contenido del segundo archivo XML en el primer archivo XML.
Diff
Esta operación comparará el primer archivo XML con el segundo archivo y genera un documento DiffGram con las diferencias entre los dos archivos XML de entrada.
En la operación Diff podemos elegir algunas opciones, como ignorar los comentarios, namespaces, prefijos y otras opciones muy claras que no necesitan mayor explicación.
Patch
Patch aplicará el resultado de un documento DiffGram (que es el resultado de una operación Diff sobre dos documentos XML), y crear un documento XML padre que contiene el contenido del documento DiffGram.
Más explicación sobre Diffgram puede ser encontrado aquí: http://msdn.microsoft.com/enus/library/aa302295.aspx.

1 comentarios:

Narcizo dijo...

Esta tarea XML es muy útil, cuando se trabajan entre diferentes plataformas. Espero les sea de utilidad.