99 votes

Comment écrire une déclaration XML en utilisant xml.etree.ElementTree

Je suis en train de générer un document XML en Python à l'aide d'un fichier ElementTree mais le tostring n'inclut pas une fonction Déclaration XML lors de la conversion en texte clair.

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 que ma chaîne inclue la déclaration XML suivante :

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

Cependant, il ne semble pas y avoir de moyen documenté de le faire.

Existe-t-il une méthode appropriée pour rendre la déclaration XML dans un fichier de type ElementTree ?

144voto

wrgrs Points 1405

Je suis surpris de constater qu'il ne semble pas y avoir de moyen de ElementTree.tostring() . Vous pouvez toutefois 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 dans ce cas, je ne pense pas que vous puissiez obtenir votre attribut "autonome" sans l'écrire vous-même.

32voto

glormph Points 904

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))

25voto

Alexander O'Mara Points 23319

Si vous incluez le encoding='utf8' vous obtiendrez un en-tête XML :

xml.etree.ElementTree.tostring écrit une déclaration d'encodage XML avec encoding='utf8'.

Exemple de code Python (fonctionne avec Python 2 et 3) :

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 Python 2 :

$ python2 example.py
without:
<xml><test>123</test></xml>

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

Avec Python 3, vous noterez le site b préfixe indiquant les octets littéraux sont retournés (comme avec Python 2) :

$ python3 example.py
without:
b'<xml><test>123</test></xml>'

with:
b"<?xml version='1.0' encoding='utf8'?>\n<xml><test>123</test></xml>"

21voto

Xml_declaration Argument

Existe-t-il une méthode appropriée pour rendre la déclaration XML dans un ElementTree ?

OUI, et il n'est pas nécessaire d'utiliser .tostring fonction. Selon Documentation de ElementTree vous devriez créer un objet ElementTree créer des éléments et des sous-éléments, définir la racine de l'arbre et enfin utiliser xml_declaration argument dans .write la ligne de déclaration est donc incluse dans le fichier de sortie.

Vous pouvez le faire de cette façon :

import xml.etree.ElementTree as ET

tree = ET.ElementTree("tree")

document = ET.Element("outer")
node1 = ET.SubElement(document, "inner")
node1.text = "text"

tree._setroot(document)
tree.write("./output.xml", encoding = "UTF-8", xml_declaration = True)  

Et le fichier de sortie est :

<?xml version='1.0' encoding='UTF-8'?>
<outer><inner>text</inner></outer>

4voto

alijandro Points 3693

J'ai rencontré ce problème récemment, après quelques recherches dans le code, j'ai trouvé le bout de code suivant qui 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, {})

La réponse est donc la suivante : si vous avez besoin d'écrire l'en-tête XML dans votre fichier, définissez la balise encoding argument autre que utf-8 o us-ascii par exemple UTF-8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X