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.