Para una estructura XML tan simple, puede que no quiera involucrar a un módulo completo XML soplado. Considere una plantilla de cadena para las estructuras más simples, o Jinja para algo un poco más complejo. Jinja puede manejar el bucle sobre una lista de datos para producir el xml interno de su lista de documentos. Eso es un poco más complicado con las plantillas de cadena de python en bruto
Para un ejemplo de Jinja, vea mi answer to a similar question.
Aquí hay un ejemplo de generación de su xml con plantillas de cadena.
import string
from xml.sax.saxutils import escape
inner_template = string.Template(' <field${id} name="${name}">${value}</field${id}>')
outer_template = string.Template("""<root>
<doc>
${document_list}
</doc>
</root>
""")
data = [
(1, 'foo', 'The value for the foo document'),
(2, 'bar', 'The <value> for the <bar> document'),
]
inner_contents = [inner_template.substitute(id=id, name=name, value=escape(value)) for (id, name, value) in data]
result = outer_template.substitute(document_list='\n'.join(inner_contents))
print result
Salida:
<root>
<doc>
<field1 name="foo">The value for the foo document</field1>
<field2 name="bar">The <value> for the <bar> document</field2>
</doc>
</root>
La decepción del enfoque de la plantilla es que no se va a escapar de <
y >
de forma gratuita. Bailé alrededor de ese problema al conectar un utilizador desde xml.sax
Obtengo 'import xml.etree.cElementTree como ET',' ImportError: No module named etree.cElementTree' - estándar OSX 10.8 python, pero de alguna manera funciona cuando lo ejecuto desde dentro de ipython. – guaka
@Kasper: no tengo una Mac así que no puedo intentar duplicar el problema. Cuéntame la versión de Python y veré si puedo replicarla en Linux. – ssokolow
@ssokolow, estoy en OSX 10.9 ahora y esto de alguna manera se ha resuelto, no recuerdo si fue por mi propia acción o si hice algo para resolverlo. – guaka