It’s a small thing, really: I have this function that converts dict objects to xml.
Here’s the function:
def dictToXml(d): from xml.sax.saxutils import escape def unicodify(o): if o is None: return u''; return unicode(o) lines = [] def addDict(node, offset): for name, value in node.iteritems(): if isinstance(value, dict): lines.append(offset + u'<%s>' % name) addDict(value, offset + u' ' * 4) lines.append(offset + u'</%s>' % name) elif isinstance(value, list): for item in value: if isinstance(item, dict): lines.append(offset + u'<%s>' % name) addDict(item, offset + u' ' * 4) lines.append(offset + u'</%s>' % name) else: lines.append(offset + u'<%s>%s</%s>' % (name, escape(unicodify(item)), name)) else: lines.append(offset + u'<%s>%s</%s>' % (name, escape(unicodify(value)), name)) addDict(d, u'') lines.append(u'') return u'\n'.join(lines)
For example, it converts this dictionary
{ 'site': { 'name': 'stackoverflow', 'blogger': [ 'Jeff', 'Joel' ] } }
to:
<site> <name>stackoverflow</name> <blogger>jeff</blogger> <blogger>joel</blogger> </site>
It works, but the addDict function looks a little too repetitive. I’m sure there’s a way to refactor it into 3 co-recursive functions named addDict, addList and addElse, but my brain is stuck. Any help?
Also, any way to get rid of the offset + thing in every line would be nice.
NOTE: I chose these semantics because I’m trying to match the behavior of the json-to-xml converter in org.json, which I use in a different part of my project. If you got to this page just looking for a dictionary to xml converter, there are some really good options in some of the answers. (Especially pyfo).
I noticed you have commonality in adding items. Using this commonality I would refactor adding an item to a separate function.
Advisory warning: this code is not tested or written by anybody who actually uses Python.