77 votes

Meilleur moyen de générer du XML en Python?

Je crée une API Web et j'ai besoin d'un bon moyen de générer très rapidement du XML bien formaté. Je ne trouve aucun moyen de le faire en python.

Remarque: Certaines bibliothèques semblent prometteuses mais manquent de documentation ou ne produisent que des fichiers.

99voto

Anurag Uniyal Points 31931

ElementTree est un bon module pour lire des données xml et de l'écriture trop par exemple

from xml.etree.ElementTree import Element, SubElement, tostring

root = Element('root')
child = SubElement(root, "child")
child.text = "I am a child"

print tostring(root)

Sortie:

<root><child>I am a child</child></root>

Voir ce tutoriel pour plus de détails et comment pretty print.

Sinon, si votre XML est simple, ne pas sous-estimer la puissance de la chaîne de mise en forme :)

xmlTemplate = """<root>
    <person>
        <name>%(name)s</name>
        <address>%(address)s</address>
     </person>
</root>"""

data = {'name':'anurag', 'address':'Pune, india'}
print xmlTemplate%data

Sortie:

<root>
    <person>
        <name>anurag</name>
        <address>Pune, india</address>
     </person>
</root>

Vous pouvez utiliser des chaînes de caractères.De modèle ou de certains modèle de moteur trop, pour la mise en forme complexe.

97voto

ars Points 35803

En utilisant lxml :

 from lxml import etree

# create XML 
root = etree.Element('root')
root.append(etree.Element('child'))
# another child with text
child = etree.Element('child')
child.text = 'some text'
root.append(child)

# pretty string
s = etree.tostring(root, pretty_print=True)
print s
 

Sortie:

 <root>
  <child/>
  <child>some text</child>
</root>
 

Voir le tutoriel pour plus d'informations.

22voto

Je voudrais utiliser la bibliothèque yattag . Je pense que c'est la manière la plus pythonique:

 from yattag import Doc

doc, tag, text = Doc().tagtext()

with tag('food'):
    with tag('name'):
        text('French Breakfast')
    with tag('price', currency='USD'):
        text('6.95')
    with tag('ingredients'):
        for ingredient in ('baguettes', 'jam', 'butter', 'croissants'):
            with tag('ingredient'):
                text(ingredient)


print(doc.getvalue())
 

17voto

Lars Nordin Points 900

Utilisez la classe lxml.builder, à partir de: http://lxml.de/tutorial.html#the-e-factory

 import lxml.builder as lb
from lxml import etree

nstext = "new story"
story = lb.E.Asset(
  lb.E.Attribute(nstext, name="Name", act="set"),
  lb.E.Relation(lb.E.Asset(idref="Scope:767"),
            name="Scope", act="set")
  )

print 'story:\n', etree.tostring(story, pretty_print=True)
 

Sortie:

 story:
<Asset>
  <Attribute name="Name" act="set">new story</Attribute>
  <Relation name="Scope" act="set">
    <Asset idref="Scope:767"/>
  </Relation>
</Asset>
 

0voto

Lee Reeves Points 351

Alternativement, vous pouvez utiliser StringIO avec une bibliothèque XML qui lit à partir de / sorties dans un fichier.

http://docs.python.org/library/stringio.html

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