[XML-SIG] Python equivalent to Builder in Ruby?

Andrew Diederich andrewdied at gmail.com
Mon Apr 30 21:34:32 CEST 2007

On Monday, April 23, 2007, 3:54:44 PM, Sébastien Arnaud wrote:

> Just like any other dev on the block I took RoR for a test drive to  
> see what the fuss was all about, but short of sharing my experience  
> with it and what I liked or disliked about it, I wanted to know if  
> there is a close equivalent to the RXML/Builder Ruby lib that saw the
> light under the RoR project:
> http://builder.rubyforge.org/

> To me it is the best part of the Rails framework :), but I can't seem
> to find a simple and syntactically attractive module in python that  
> achieves the same purpose. I posted below a quick naive example for  
> those who are not familiar with ruby-builder lib.

If you're just comparing how attractive the syntax is, that sounds
more like a python v. ruby discussion, rather than an XML-SIG
discussion.  Normally in the python world the goal is to be as
pythonic as possible, which is, of course, beautiful in its own right.

> Thank you for any type of pointers! If I can't find anything then I  
> might decide to start to write my own python based module on RXML/ 
> Builder philosophy.

<snipping ruby code>

> Output
> ======
> <?xml-stylesheet href="/xsl/mytext.xsl" type="text/xsl"?>
> <mytestdoc>
>    <testing world="Escape me &lt; &gt; !!!">Hello World!</testing>
>    <person>
>      <comment>Jim's dog is nice &amp; friendly</comment>
>      <name>Jim</name>
>    </person>
> </mytestdoc>

Since ElementTree is included in python 2.5, I'd always give that a
shot, first:

# use xml.etree.ElementTree for a pure python implementation
import xml.etree.cElementTree as ET

# Create the root element
mytestdoc = ET.Element('mytestdoc')

# Attributes can be created with dictionaries or keyword arguments
# Add text with <object>.text
testing = ET.SubElement(mytestdoc, 'testing', {'world': 'Escape me < > !!!'})
testing.text = 'Hello World!'

person = ET.SubElement(mytestdoc, 'person')
# You can add text directly to new subnodes
ET.SubElement(person, 'comment').text = "Jim's doc is nice & friendly"
ET.SubElement(person, 'name').text = 'Jim'

# For testing, dump out the text to stdout

# Or, you can write it to a file
tree = ET.ElementTree(mytestdoc)

This gives you:

<mytestdoc><testing world="Escape me &lt; &gt;
!!!">Hello World!</testing><person><comment>Jim's doc is nice &amp;

ElementTree doesn't put in the xsl-stylesheet line, and it doesn't
prettyprint.  http://effbot.org/zone/element-lib.htm has a short
function for that.

Best regards,
Andrew Diederich

More information about the XML-SIG mailing list