2012-09-27 36 views
9

Estoy escribiendo un poco de XML con el árbol de elementos.Python - Element Tree está eliminando la declaración XML

Le doy al código un archivo de plantilla vacío que comienza con la declaración XML: <?xml version= "1.0"?> cuando ET ha terminado de hacer sus cambios y escribe el XML completo quitando la declaración y comenzando con la etiqueta raíz. ¿Cómo puedo detener esto?

escritura llamada:

ET.ElementTree(root).write(noteFile)

Respuesta

18

Según the documentation:

escritura (archivo, codificación = "us-ascii", xml_declaration = Ninguno, method = "xml")

Escribe el árbol de elementos en un archivo, como XML. archivo es un nombre de archivo, o un objeto de archivo abierto para escribir. la codificación 1 es la codificación de salida (el valor predeterminado es US-ASCII). xml_declaration controla si se debe agregar una declaración XML al archivo. Use False para never, True for always, None para solo si no es US-ASCII o UTF-8 (el valor predeterminado es None). El método es "xml", "html" o "text" (el valor predeterminado es "xml"). Devuelve una cadena codificada.

Así, write(noteFile) está diciendo explícitamente que escribir una declaración XML sólo si la codificación no es de US-ASCII o UTF-8, y que la codificación es US-ASCII; por lo tanto, no obtienes ninguna declaración.

supongo si usted no leyó mucho este hecho, su siguiente pregunta va a ser "¿Por qué mi Unicode roto", así que vamos a arreglar dos a la vez:

ET.ElementTree(root).write(noteFile, encoding="utf-8", xml_declaration=True) 
+0

¡Ah! De acuerdo, no me di cuenta de que estaba reformando por completo el documento, gracias, es muy útil saberlo. –

+1

Bueno, depende de la implementación de ElementTree decidir si generar todo el XML desde cero o reutilizar las piezas existentes. Creo que 'lxml' tiene un caché bastante inteligente, por lo que si solo lee en un archivo pequeño y lo vuelve a escribir, reutiliza todo el nodo raíz. Pero la declaración no es parte del nodo raíz, por lo que realmente no hay forma de evitarlo. – abarnert

+0

Si la solución arriba aceptada no funciona para usted, por favor revise la respuesta de @Olli ya que su pequeña modificación me salvó el día – ToTenMilan

5

Existen diferentes versiones de ElementTree. Algunos de ellos aceptan el argumento xml_declaration, otros no.

El que tengo, no. Emite la declaración si y solo si encoding != 'utf-8'. Entonces, para obtener la declaración, llamo al write(filename, encoding='UTF-8').

+0

+1 Eso funcionó para mí. Yo uso Python 2.6. – vwvolodya

Cuestiones relacionadas