2010-01-07 7 views
6

Sé que este es un caso límite si realmente pertenece a stackoverflow o superusuario, pero parece que hay bastantes preguntas de 'código de edición' sobre aquí, lo estoy publicando en SO.Cómo obtener un XML plano para que las entidades externas se combinen con el nivel superior

Tengo una pila de archivos XML que alguien en su sabiduría infinita ha decidido explotar en varios archivos usando las etiquetas, lo que en consecuencia hace que depurar/editarlos sea un gran P-i-t-A. Por lo tanto estoy buscando:

  1. Un modo en VIM para abrirlos en un solo búfer (preferiblemente para que los cambios se guarden en archivos correctos de entidades externas), O;
  2. Una forma de expandir los archivos en VIM para que las entidades externas se lean y reemplacen en el búfer, O;
  3. un fácil bash/sed manera/pitón de hacer esto en una línea de comandos (o en .vimrc)

Los archivos incluidos en el nivel superior podría incluir nuevos archivos y así sucesivamente en quién sabe de cuántos niveles por lo que este necesita ser recursivo ...

He aquí una muestra maqueta de lo que el archivo de nivel superior se parece a:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE foobar PUBLIC "foobar:dtd" "foobar.dtd" [ 

     <!ENTITY foo SYSTEM "foo.xml"> 

     <!ENTITY bar SYSTEM "bar.xml"> 
]> 
<foo> 
     <params> 
       &foo; 
     </params> 
     <bar> 
       &bar; 
     </bar> 
</foo> 

EDITAR: la lista está en orden de preferencia - Si no hay puntos 1 o 2 soluciones están disponibles, la recompensa va para el mejor # 3 ...

EDIT 2: Parece que @Gaby 's obras respuesta, pero lamentablemente sólo en parte, a menos que esté haciendo algo mal - escribiré algún tipo de herramienta usando su respuesta y la publicaré aquí para mejoras. Por supuesto, una solución # 1 o # 2 sería apreciada ... :)

EDITAR 3: Ok, lo mejor no Emacs -Respuesta recibirá la recompensa;)

Conclusión : Gracias a @hcayless ahora tengo una solución de trabajo # 2, añadí:

autocmd BufReadPost,FileReadPost *.xml silent %!xmllint --noent - 2> /dev/null 

a mi .vimrc y todo es miel sobre hojuelas.

+0

¿Podría hacerse esto con xslt? – michael

+1

No había visto esto antes, pero aparentemente es una parte honesta de bondad de XML. http://www.xml.com/pub/a/98/08/xmlqna2.html es una explicación que encontré para ello. – MikeSep

+0

Sí, es válido y, por lo tanto, dos veces más molesto :) – Kimvais

Respuesta

5

Si tiene instalado libxml2, entonces xmllint probablemente lo haga por usted. Dependiendo de su configuración, es posible que necesite más params, pero por su ejemplo,

xmllint --noent foobar.xml 

va a imprimir el archivo de salida estándar con todas las entidades resueltos. Debe ser lo suficientemente fácil como para envolver algunos scripts de bash para hacer lo que necesita.

+0

Funciona perfectamente. ¡Gracias! - Ahora solo necesito agregar esto para que se haga automáticamente en .vimrc al abrir .xml -files. – Kimvais

1

Para la opción # 3 se puede echar un vistazo a pixdom y mirar la documentación en pxdom 1.5 A Python DOM implementation

DOMConfiguration parámetros de

El resultado de la operación de análisis depende de los parámetros establecidos en el LSParser.domConfig mapping. Por forma predeterminada, de conformidad con la especificación DOM , todas las secciones CDATA se ser reemplazados por nodos de texto plano y todas las referencias entidad obligada serán reemplazado por el contenido de la entidad a que se refiere. Esto incluye referencias externas a la entidad y el subconjunto externo .

incluye serializador para guardar el documento en un archivo ..

0

¿Está buscando algo como esto?

#!/opt/local/bin/python 
import sys 
if len(sys.argv) < 2: 
    print "some files needed." 
    sys.exit() 

final = """ 
<?xml version="1.0" encoding="ISO-8859-1"?> 
<nodes> 
""" 
for a in sys.argv[1:]: 
    ca = a.replace(".xml","") 
    final += "<" + ca + ">\n" 
    infile = open(a) 
    final += infile.read() 
    final += "</" + ca + ">\n" 

final += "</nodes>\n" 

outfile = open("final.xml", "w") 
outfile.write(final) 
outfile.close() 
Cuestiones relacionadas