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>