tengo algo armado hace un tiempo y a raíz de alguna pregunta en redopenbi lo publico aquí.
Se trata de leer un archivo XML y convertirlo en un archivo plano separado por comas utilizando Pentaho Data Integration (PDI) o Kettle.
Introducción
PDI siempre tratará de convertir las fuentes de entrada en filas y columnas, con este principio hay que partir siempre que uno intente hacer algo con este software.
El XML en un tipo de datos jerárquico, por ello habrá que transformarlo a dato tabular. Para manipular XML se utiliza XQuery y XPath como para manipular datos relacionales utilizamos SQL, cualquiera que quiera trabajar con este tipo de datos debe interiorizarse con estos conceptos.
Objetivo
Nuestro objetivo es leer el archivo entrada.txt, obtener los datos que deseamos y escribirlos en un archivo tabular separado por comas llamado salidaCSVFromXML.txt
<?xml version="1.0" encoding="UTF-8"?>
<raiz>
<dato id="1">dato 1
<otroDato atributo="ab">otro dato 1</otroDato>
</dato>
<dato id="2">dato 2
<otroDato atributo="abc">otro dato 2</otroDato>
</dato>
<dato id="3">dato 3
<otroDato atributo="abcd">otro dato 3</otroDato>
</dato>
<dato id="4">dato 4
<otroDato atributo="abcde">otro dato 4</otroDato>
</dato>
</raiz>
El archivo salidaCSVFromXML.txt contendrá:
datoCol;idCol;otroDatoCol;atributoCol
dato 1; 1;otro dato 1;ab
dato 2; 2;otro dato 2;abc
dato 3; 3;otro dato 3;abcd
dato 4; 4;otro dato 4;abcde
El mapeo está claro y es:
Texto del nodo /raiz/dato a columna datoCol
Valor del atributo id del nodo /raiz/dato a columna idCol
Texto del nodo /raiz/dato/otroDato a columna otroDatoCol
Valor del atributo atributo del nodo /raiz/dato/otroDato a columna atributoCol
Manos a la obra
Abrimos Kettle utilizando el comando spoon.sh o spoon.bat según nuestro sistema operativo.
Creamos una nueva transformación y arrastramos al editor los pasos Entrada\"Obtener datos XML" y a la derecha Salida\"Salida Fichero de Texto", luego unimos ambos pasos y editamos la entrada XML haciendo doble click.
En la primera pestaña configuramos:
En la segunda pestaña debemos configurar cual será el nodo a ciclar, cada ciclo creará una nueva fila. En nuestro caso /raiz/nodo, en cada ciclo se asume que se trabaja a partir de este nodo. La cadena /raiz/nodo es una instrucción XPath.
Para darnos una idea de que implica esto, podemos utilizar uno de los tantos testers XPath online que existen, por ejemplo este http://www.mizar.dk/XPath/Default.aspx
Si colocamos:
Y presionamos el botón "Test XPath", obtenemos el resultado con los nodos seleccionados por la expresión XPath en color:
Recomiendo utilizar estas herramientas siempre que haya que evaluar expresiones XPath.
Volvamos a Kettle y configuremos la pestaña "Campos" de la siguiente manera:
Notemos que lo que colocamos en la columna XPath es relativo a lo que definimos en la pestaña anterior, por ejemplo la tercera fila que define la columna otroDatoCol, tiene la expresión XPath otroDato/text(), pero la expresión completa es /raiz/dato/otroDato/text(), podemos ver la salida en el tester online con esta expresión completa:
Ahora cerramos el editor del paso presionando el botón "OK" y editamos el paso de salida de texto haciendo doble clic en el, en la primera pestaña configuramos lo siguiente:
Cerramos este paso presionando el botón "OK" y listo, ya lo podemos ejecutar.
He subido a mi repo de github la trasnformación y el archivo de entrada de ejemplo: https://github.com/magm3333/material-osbi/tree/master/XML2CSV
Espero les sea de utilidad
Saludos
Mariano
No hay comentarios.:
Publicar un comentario