xml python-3.x elementtree

¿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.

  1. ¿Por qué se modifica?
  2. ¿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() .