Procesar archivos xml con xmlstarlet | Algo de Linux

lunes, 21 de septiembre de 2015

Procesar archivos xml con xmlstarlet

Hoy en día resulta bastante común encontrar aplicaciones que guardan información en ficheros xml.

xmlstarlet es una interesante herramienta de línea de comandos que nos va a permitir obtener datos de un fichero xml, modificarlo o validarlo.

En nuestro caso, a principios de curso, creamos las cuentas de los usuarios a partir de ficheros .xml generados mediante Rayuela. Pues bien, podemos utilizar xmlstarlet para procesar estos ficheros y obtener la información que necesitamos para convertirla a otro formato, como por ejemplo .csv

Supongamos que el fichero de exportación de alumnos almacena la información de cada alumno de la siguiente manera:
<alumno>
   <nie>9496969</nie>
   <nombre>Pedro</nombre>
   <primer-apellido>Aguilar</primer-apellido>
   <segundo-apellido>Cobo</segundo-apellido>
   <fecha-nacimiento>20/10/2002</fecha-nacimiento>
   <datos-usuario-rayuela>
      <es-usuario>true</es-usuario>
      <login>paguilarc01</login>
      <id-usuario>597450</id-usuario>
   </datos-usuario-rayuela>
   <grupo>E1A</grupo>
   <foto>
      <con-foto>true</con-foto>
      <formato>jpg</formato>
      <nombre-fichero>9496969.jpg</nombre-fichero>
   </foto>
</alumno>
Podemos extraer los datos de nie, nombre, primer-apellido, segundo-apellido y login de todos los alumnos y almacenarlos en un fichero csv con la siguiente estructura: 
9496969,Pedro,Aguilar Cobo,paguilarc01

Con tan sólo ejecutar el comando:
$ xmlstarlet sel -t -m //alumnado-centro/alumno -v nie -o "," -v nombre -o "," -v primer-apellido -o " " -v segundo-apellido -o "," -m datos-usuario-rayuela -v login -n Alumnos.xml
Si analizáis la sintaxis anterior veréis que es muy sencilla:
  • Utilizando la opción de selección (sel), aplicamos la plantilla (-t) que le indicamos a continuación al comando.
  • Procesamos cada entidad alumno (//alumnado-centro/alumno) y extraemos su nie (-v nie).
  • Insertamos una coma (-o ",") en la salida.
  • Extraemos el nombre (-v nombre).
  • Insertamos una coma (-o ",") en la salida.
  • Extraemos el primer-apellido (-v primer-apellido). 
  • Insertamos una coma (-o ",") en la salida.
  • Extraemos el segundo-apellido (-v segundo-apellido). 
  • Y de la entidad datos-usuario-rayuela del alumno (-m datos-usuario-rayuela -v login) extraemos su login.
  • E insertamos un salto de línea (-n) en la salida.
Del mismo modo, podemos extraer datos del fichero de exportación de datos de profesores puesto que la estructura es similar:
$ xmlstarlet sel -t -m //profesorado-centro/profesor -v dni -o "," -v nombre -o "," -v primer-apellido -o " " -v segundo-apellido -o "," -m datos-usuario-rayuela -v login -o "@iesvalledeljerteplasencia.es" -n ExportacionDatosProfesorado.xml
Publicado por primera vez en http://enavas.blogspot.com.es