Creating a simple XML file using python

0 votes
asked Aug 31, 2010 by blankman

What are my options if I want to create a simple XML file in python? (library wise)

The xml I want looks like:

     <field1 name="blah">some value1</field1>
     <field2 name="asdfasd">some vlaue2</field2>


4 Answers

0 votes
answered Aug 31, 2010 by whaley

For the simplest choice, I'd go with minidom: . It is built in to the python standard library and is straightforward to use in simple cases.

Here's a pretty easy to follow tutorial:

0 votes
answered Aug 31, 2010 by ssokolow

These days, the most popular (and very simple) option is the ElementTree API, which has been included in the standard library since Python 2.5.

The available options for that are:

  • ElementTree (Basic, pure-Python implementation of ElementTree. Part of the standard library since 2.5)
  • cElementTree (Optimized C implementation of ElementTree. Also offered in the standard library since 2.5)
  • LXML (Based on libxml2. Offers a rich superset of the ElementTree API as well XPath, CSS Selectors, and more)

Here's an example of how to generate your example document using the in-stdlib cElementTree:

import xml.etree.cElementTree as ET

root = ET.Element("root")
doc = ET.SubElement(root, "doc")

ET.SubElement(doc, "field1", name="blah").text = "some value1"
ET.SubElement(doc, "field2", name="asdfasd").text = "some vlaue2"

tree = ET.ElementTree(root)

I've tested it and it works, but I'm assuming whitespace isn't significant. If you need "prettyprint" indentation, let me know and I'll look up how to do that. (It may be an LXML-specific option. I don't use the stdlib implementation much)

For further reading, here are some useful links:

As a final note, either cElementTree or LXML should be fast enough for all your needs (both are optimized C code), but in the event you're in a situation where you need to squeeze out every last bit of performance, the benchmarks on the LXML site indicate that:

  • LXML clearly wins for serializing (generating) XML
  • As a side-effect of implementing proper parent traversal, LXML is a bit slower than cElementTree for parsing.
0 votes
answered Aug 4, 2011 by rescdsk

The lxml library includes a very convenient syntax for XML generation, called the E-factory. Here's how I'd make the example you give:

import lxml.etree
import lxml.builder    

E = lxml.builder.ElementMaker()
ROOT = E.root
DOC = E.doc
FIELD1 = E.field1
FIELD2 = E.field2

the_doc = ROOT(
            FIELD1('some value1', name='blah'),
            FIELD2('some value2', name='asdfasd'),

print lxml.etree.tostring(the_doc, pretty_print=True)


    <field1 name="blah">some value1</field1>
    <field2 name="asdfasd">some value2</field2>

It also supports adding to an already-made node, e.g. after the above you could say

the_doc.append(FIELD2('another value again', name='hithere'))
0 votes
answered Aug 2, 2015 by scls

Yattag or provides an interesting API to create such XML document (and also HTML documents).

It's using context manager and with keyword.

from yattag import Doc, indent

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

with tag('root'):
    with tag('doc'):
        with tag('field1', name='blah'):
            text('some value1')
        with tag('field2', name='asdfasd'):
            text('some value2')

result = indent(
    indentation = ' '*4,
    newline = '\r\n'


so you will get:

        <field1 name="blah">some value1</field1>
        <field2 name="asdfasd">some value2</field2>
Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter