ANN: XML builder for Python

Gerard flanagan grflanagan at gmail.com
Thu Jul 3 09:29:12 CEST 2008


Jonas Galvez wrote:
> Not sure if it's been done before, but still...
> 
>   from __future__ import with_statement
>   from xmlbuilder import builder, element
> 
>   xml = builder(version="1.0", encoding="utf-8")
>   with xml.feed(xmlns='http://www.w3.org/2005/Atom'):
>     xml.title('Example Feed')
>     xml.link(None, href='http://example.org/')
>     xml.updated('2003-12-13T18:30:02Z')
>     with xml.author:
>       xml.name('John Doe')
>     xml.id('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6')
>     with xml.entry:
>       xml.title('Atom-Powered Robots Run Amok')
>       xml.link(None, href='http://example.org/2003/12/13/atom03')
>       xml.id('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a')
>       xml.updated('2003-12-13T18:30:02Z')
>       xml.summary('Some text.')
>   print xml
> 
> Will produce:
> 
>   <?xml version="1.0" encoding="utf-8"?>
>   <feed xmlns="http://www.w3.org/2005/Atom">
>     <title>Example Feed</title>
>     <link href="http://example.org/" />
>     <updated>2003-12-13T18:30:02Z</updated>
>     <author>
>       <name>John Doe</name>
>     </author>
>     <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>
>     <entry>
>       <title>Atom-Powered Robots Run Amok</title>
>       <link href="http://example.org/2003/12/13/atom03" />
>       <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
>       <updated>2003-12-13T18:30:02Z</updated>
>       <summary>Some text.</summary>
>     </entry>
>   </feed>
> 
> http://github.com/galvez/gae-rest/tree/258066f5e1a32c999e04a9313943fdfa8e64edd9/xmlbuilder.py
> 
> --Jonas Galvez
> --
> http://mail.python.org/mailman/listinfo/python-list
> 

Nice! Here's a version that uses elementtree:

8<----------------------------------------------------
from __future__ import with_statement
from xml.etree import ElementTree as ET


class element(object):
     def __init__(self, name, parent):
         self.parent = parent
         self.element = ET.SubElement(parent, name)
     def __str__(self):
         return ET.tostring(self.parent)
     def __getattr__(self, name):
         return element(name, self.parent)
     def __getitem__(self, name):
         return element(name, self.parent)
     def __enter__(self):
         self.parent = self.element
         return self
     def __exit__(self, type, value, tb):
         pass
     def __call__(self, value='', **kargs):
         self.element.text = value
         self.element.attrib = kargs
         return self

class builder(element):
     def __init__(self, version, encoding):
         self.parent = ET.Element('root')

if __name__ == "__main__":
     xml = builder(version="1.0", encoding="utf-8")
     with xml.feed(xmlns='http://www.w3.org/2005/Atom') as feed:
         feed.title('Example Feed')
         feed.link(href='http://example.org/')
         feed.updated('2003-12-13T18:30:02Z')
         with feed.author as author:
             author.name('John Doe')
         feed.id('urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6')
         with feed.entry as entry:
             entry.title('Atom-Powered Robots Run Amok', class_='l')
             entry.link(href='http://example.org/2003/12/13/atom03')
             entry.id('urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a')
             entry.updated('2003-12-13T18:30:02Z')
             entry.summary('Some text.')
         with feed.entry as entry:
             entry.title('2')
             entry.link(href='2')
             entry.id('2')
             entry.updated('2')
             entry.summary('2')
     print xml
8<----------------------------------------------------







More information about the Python-list mailing list