tutorial library example etree dict create python xml elementtree

python - library - Cómo escribir una declaración XML usando xml.etree.ElementTree



xml python 3 (7)

Estoy generando un documento XML en Python usando un ElementTree , pero la función tostring no incluye una declaración XML al convertir a texto sin formato.

from xml.etree.ElementTree import Element, tostring document = Element(''outer'') node = SubElement(document, ''inner'') node.NewValue = 1 print tostring(document) # Outputs "<outer><inner /></outer>"

Necesito que mi cadena incluya la siguiente declaración XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>

Sin embargo, no parece haber ninguna forma documentada de hacerlo.

¿Existe un método adecuado para presentar la declaración XML en un ElementTree ?


El ejemplo de trabajo mínimo con el uso del paquete ElementTree :

import xml.etree.ElementTree as ET document = ET.Element(''outer'') node = ET.SubElement(document, ''inner'') node.text = ''1'' res = ET.tostring(document, encoding=''utf8'', method=''xml'').decode() print(res)

la salida es:

<?xml version=''1.0'' encoding=''utf8''?> <outer><inner>1</inner></outer>


Esto funciona si solo quieres imprimir. Obteniendo un error cuando trato de enviarlo a un archivo ...

import xml.dom.minidom as minidom import xml.etree.ElementTree as ET from xml.etree.ElementTree import Element, SubElement, Comment, tostring def prettify(elem): rough_string = ET.tostring(elem, ''utf-8'') reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent=" ")


Me encuentro con este problema recientemente, después de excavar el código, encontré el siguiente fragmento de código es la definición de la función ElementTree.write

def write(self, file, encoding="us-ascii"): assert self._root is not None if not hasattr(file, "write"): file = open(file, "wb") if not encoding: encoding = "us-ascii" elif encoding != "utf-8" and encoding != "us-ascii": file.write("<?xml version=''1.0'' encoding=''%s''?>/n" % encoding) self._write(file, self._root, encoding, {})

Entonces, la respuesta es: si necesita escribir el encabezado XML en su archivo, configure el argumento de encoding que no sea utf-8 o us-ascii , por ejemplo, UTF-8


Me sorprende descubrir que no parece haber una forma con ElementTree.tostring() . Sin embargo, puede usar ElementTree.ElementTree.write() para escribir su documento XML en un archivo falso:

from io import BytesIO from xml.etree import ElementTree as ET document = ET.Element(''outer'') node = ET.SubElement(document, ''inner'') et = ET.ElementTree(document) f = BytesIO() et.write(f, encoding=''utf-8'', xml_declaration=True) print(f.getvalue()) # your XML file, encoded as UTF-8

Ver esta pregunta Incluso entonces, no creo que puedas obtener tu atributo "independiente" sin escribirlo prefiriéndolo tú mismo.


Yo usaría ElementTree :

try: from lxml import etree print("running with lxml.etree") except ImportError: try: # Python 2.5 import xml.etree.cElementTree as etree print("running with cElementTree on Python 2.5+") except ImportError: try: # Python 2.5 import xml.etree.ElementTree as etree print("running with ElementTree on Python 2.5+") except ImportError: try: # normal cElementTree install import cElementTree as etree print("running with cElementTree") except ImportError: try: # normal ElementTree install import elementtree.ElementTree as etree print("running with ElementTree") except ImportError: print("Failed to import ElementTree from any known place") document = etree.Element(''outer'') node = etree.SubElement(document, ''inner'') print(etree.tostring(document, encoding=''UTF-8'', xml_declaration=True))


Yo usaría lxml (vea http://lxml.de/api.html ).

Entonces tú puedes:

from lxml import etree document = etree.Element(''outer'') node = etree.SubElement(document, ''inner'') print(etree.tostring(document, xml_declaration=True))


Si incluye la encoding=''utf8'' , obtendrá un encabezado XML :

xml.etree.ElementTree.tostring escribe una declaración de codificación XML con encoding = ''utf8''

Ejemplo de código de Python 2:

import xml.etree.ElementTree as ElementTree tree = ElementTree.ElementTree( ElementTree.fromstring(''<xml><test>123</test></xml>'') ) root = tree.getroot() print ''without:'' print ElementTree.tostring(root, method=''xml'') print print ''with:'' print ElementTree.tostring(root, encoding=''utf8'', method=''xml'')

Salida:

without: <xml><test>123</test></xml> with: <?xml version=''1.0'' encoding=''utf8''?> <xml><test>123</test></xml>