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 ?

34
demandé sur Steven Vascellaro 2013-03-12 12:42:21

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.

59
répondu wrgrs 2017-05-23 12:17:50

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))
19
répondu glormph 2013-03-12 08:50:45

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>
7
répondu Alexander O'Mara 2017-02-27 21:25:42

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

3
répondu alijandro 2015-01-29 06:22:05

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))
0
répondu Alessandro 2015-04-23 11:01:04

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="  ")
0
répondu Rebecca Fallon 2016-03-09 15:36:11

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>
0
répondu Andriy 2018-09-23 05:35:40