¿Por qué el paquete xml modifica mi archivo xml en Python3?
python-3.x elementtree (1)
Utilizo la biblioteca
xml
en Python3.5 para
leer
y
escribir
un archivo xml.
No modifico el archivo.
Solo abre y escribe.
Pero la biblioteca modifica el archivo.
- ¿Por qué se modifica?
- ¿Cómo puedo prevenir esto? por ejemplo, solo quiero reemplazar una etiqueta específica o su valor en un archivo xml bastante complejo sin perder ninguna otra información.
Este es el archivo de ejemplo
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<movie>
<title>Der Eisbär</title>
<ids>
<entry>
<key>tmdb</key>
<value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">9321</value>
</entry>
<entry>
<key>imdb</key>
<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">tt0167132</value>
</entry>
</ids>
</movie>
Este es el codigo
import xml.etree.ElementTree as ET
tree = ET.parse(''x.nfo'')
tree.write(''y.nfo'', encoding=''utf-8'')
Y el archivo xml se convierte en esto
<movie xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<title>Der Eisbär</title>
<ids>
<entry>
<key>tmdb</key>
<value xsi:type="xs:int">9321</value>
</entry>
<entry>
<key>imdb</key>
<value xsi:type="xs:string">tt0167132</value>
</entry>
</ids>
</movie>
- La línea 1 se ha ido.
-
La etiqueta
<movie>
en la línea 2 tiene atributos ahora. -
La etiqueta
<value>
en la línea 7 y 11 ahora tiene menos atributos.
Tenga en cuenta que "paquete xml" y "la biblioteca
xml
" son ambiguos.
Hay varios módulos relacionados con XML en la biblioteca estándar:
https://docs.python.org/3/library/xml.html
.
¿Por qué se modifica?
ElementTree mueve las declaraciones de espacio de nombres al elemento raíz, y se eliminan los espacios de nombres que no se usan realmente en el documento.
¿Por qué ElementTree hace esto? No lo sé, pero quizás sea una forma de simplificar la implementación.
¿Cómo puedo prevenir esto? por ejemplo, solo quiero reemplazar una etiqueta específica o su valor en un archivo xml bastante complejo sin perder ninguna otra información.
No creo que haya una manera de prevenir esto. El tema ha sido mencionado anteriormente. Aquí hay dos preguntas muy similares sin respuestas:
- ¿Cómo analizo y escribo XML usando ElementTree de Python sin mover espacios de nombres?
- Mantenga los espacios de nombres existentes al sobrescribir archivos XML con ElementTree y Python
Mi sugerencia es usar lxml en lugar de ElementTree. Con lxml, las declaraciones de espacio de nombres permanecerán donde ocurren en el archivo original.
La línea 1 se ha ido.
Esa línea es la declaración XML. Se recomienda pero no es obligatorio tener uno.
Si siempre desea una declaración XML, use
xml_declaration=True
en la llamada al método
write()
.