Ver la versión completa : Combinar XMLs desde linux?
crossmax
12/04/2012, 11:35
Buenas,
Siempre acabo por aqui cuando acabo mas perdido que un pulpo en un garaje... a veces siento ser tan brasillas ;-)
El caso es que necesito unir en un unico XML el contenido de bastantes XML que están contenidos a su vez en diferentes carpetas. En principio un script bash me soluciona parte del problema y tengo algo de idea.
El problema es que de manejo de XML tengo bastante menos idea y estoy seguro de que hay alguna herramienta que me puede simplificar la vida (para no hacerlo todo con puro bash).
La estructura del XML final será igual que la de los XML que tengo que combinar. Los cambios serian: añadir los registros de cada XML y formar una cabecera (etiquetas) que corresponda con los nuevos datos (la suma de todos los XML combinados).
Me podéis iluminar un poquito y decidme por donde buscar? Que herramientas puedo usar y si podria hacerlo desde linea de comandos?
Mil gracias, como siempre.
GameMaster
12/04/2012, 11:37
No se , has probado las librerias Tiny XML ?
http://sourceforge.net/projects/tinyxml/
DarkDijkstra
12/04/2012, 11:51
Hasta donde sé, no hay "herramientas" para hacerlo, tendrías que programar tú algo usando alguna librería de xml (como la que dice gamemaster)...
Siempre que he tenido que hacer algo asi, he tirado de python, que para mi es lo más rápido a la hora de programar, y ahí tienes la librerías como ElementTree que te permitirían hacer lo que quieres de manera sencilla...
Mi consejo es que cojas el lenguaje de programación que mejor se te de y que tenga manejo de xmls de manera sencilla y te hagas un pequeño script para lo que necesitas
xslt/xpath es la tecnología y xmlstarlet el comando. O xsltproc si puedes hacerlo todo con xslt.
Ahora, xslt es algo muy complejo de escribir y xmlstarlet hace muchísimas cosas además de lo que quieres. Si lo único que quieres es concatenacioens simples de archivos xml, entonces a lo mejor prefieres hacerte tú mismo el editor en cualquier lenguaje de script. En Python es relativamente sencillo.
Nathrezim
12/04/2012, 12:56
Si tienen todos la misma estructura y lo que quieres es concatenar un conjunto de nodos que se repiten en los diferentes ficheros, ¿no te vladría con cortar el número de lineas que ocupan los nodos de la "cabecera" y los del "pie" con head y tail de *nix y concatenar el resultado? al final le pones al principio del fichero resultante las lineas de la cabecera y del pie de cualquier fichero original y te vale.
algo asi:
Fichero1:
<cabecera>
</contenido1>
</contenido2>
</cabecera>
Fichero2:
<cabecera>
</contenido3>
</cabecera>
Fichero temporal:
</contenido1>
</contenido2>
</contenido3>
Fichero final:
<cabecera>
</contenido1>
</contenido2>
</contenido3>
</cabecera>
Pero para eso todos los ficheros tienen que estar formados de la misma manera (con los nodos de la cabecera/pie ocupando el mismo número de lineas).
BIBAN LAS ÑAPAS RÁPIDAS HOYGA
crossmax
12/04/2012, 13:38
Si tienen todos la misma estructura y lo que quieres es concatenar un conjunto de nodos que se repiten en los diferentes ficheros, ¿no te vladría con cortar el número de lineas que ocupan los nodos de la "cabecera" y los del "pie" con head y tail de *nix y concatenar el resultado? al final le pones al principio del fichero resultante las lineas de la cabecera y del pie de cualquier fichero original y te vale.
algo asi:
Fichero1:
<cabecera>
</contenido1>
</contenido2>
</cabecera>
Fichero2:
<cabecera>
</contenido3>
</cabecera>
Fichero temporal:
</contenido1>
</contenido2>
</contenido3>
Fichero final:
<cabecera>
</contenido1>
</contenido2>
</contenido3>
</cabecera>
Pero para eso todos los ficheros tienen que estar formados de la misma manera (con los nodos de la cabecera/pie ocupando el mismo número de lineas).
BIBAN LAS ÑAPAS RÁPIDAS HOYGA
Me mola! No queria liarme la manta a la cabeza con bash pero esta solucion es bastante sencilla.
Voy a darle caña y te cuento.
Gracias a todos
La solución de Nathrezim, si funciona, es para quitarse el sombrero :D
Si cabeceras y pies no ocupan lo mismo porque no están formateados para que los lean los humanos, quizá te sirva ejecutar un "xmlstarlet format" antes. Es decir, un archivo así:
<content><element>1</element></content>
Si haces "xmlstarlet format file.xml" se imprime así:
<?xml version="1.0"?>
<content>
<element>1</element>
</content>
Y entonces ya puedes aplicar la solución de Nathrezim
crossmax
12/04/2012, 14:13
La solución de Nathrezim, si funciona, es para quitarse el sombrero :D
Si cabeceras y pies no ocupan lo mismo porque no están formateados para que los lean los humanos, quizá te sirva ejecutar un "xmlstarlet format" antes. Es decir, un archivo así:
<content><element>1</element></content>
Si haces "xmlstarlet format file.xml" se imprime así:
<?xml version="1.0"?>
<content>
<element>1</element>
</content>
Y entonces ya puedes aplicar la solución de Nathrezim
Con esta ayuda cualquiera lo consigue, muchas gracias.
A ver si me pongo, que estoy teniendo problemas con la conexion ssh y no puedo probar.
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.