Comment écrire une déclaration XML en utilisant xml.programme etree.ElementTree
je génère un document XML en Python en utilisant un ElementTree
, mais la fonction tostring
n'inclut pas de déclaration XML lors de la conversion en texte simple.
from xml.etree.ElementTree import Element, tostring
document = Element('outer')
node = SubElement(document, 'inner')
node.NewValue = 1
print tostring(document) # Outputs "<outer><inner /></outer>"
j'ai besoin de ma chaîne de caractères pour inclure la déclaration XML suivante:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
cependant, il ne semble pas y avoir de façon documentée de le faire.
y a-t-il une méthode appropriée pour avoir rendu la déclaration XML dans un ElementTree
?
7 réponses
je suis surpris de constater qu'il ne semble pas être une façon de ElementTree.tostring()
. Vous pouvez cependant utiliser ElementTree.ElementTree.write()
pour écrire votre document XML dans un faux fichier:
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
voir cette question . Même alors, je ne pense pas que vous pouvez obtenir votre attribut "autonome" sans l'écrire vous-même.
j'utiliserais lxml (voir http://lxml.de/api.html ).
alors vous pouvez:
from lxml import etree
document = etree.Element('outer')
node = etree.SubElement(document, 'inner')
print(etree.tostring(document, xml_declaration=True))
si vous incluez le encoding='utf8'
, vous obtiendrez un en-tête XML :
xml.programme etree.ElementTree.tostring écrit une déclaration D'encodage XML avec encoding = 'utf8'
exemple de code 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')
sortie:
without:
<xml><test>123</test></xml>
with:
<?xml version='1.0' encoding='utf8'?>
<xml><test>123</test></xml>
j'ai rencontré ce problème récemment, après avoir creusé le code, j'ai trouvé l'extrait de code suivant est la définition de la fonction 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, {})
donc la réponse est, si vous avez besoin d'écrire l'en-tête XML dans votre fichier, définissez l'argument encoding
autre que utf-8
ou us-ascii
, par exemple UTF-8
je voudrais utiliser ET :
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))
cela fonctionne si vous voulez juste imprimer. D'avoir une erreur lorsque j'essaie d'envoyer un fichier...
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=" ")
exemple de fonctionnement minimal avec ElementTree
utilisation du paquet:
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 sortie est:
<?xml version='1.0' encoding='utf8'?>
<outer><inner>1</inner></outer>