这是一件小事,真的:我有这个函数将dict对象转换为xml.
这是功能:
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)
例如,它会转换此字典
{ 'site': { 'name': 'stackoverflow', 'blogger': [ 'Jeff', 'Joel' ] } }
至:
stackoverflow jeff joel
它有效,但addDict
功能看起来有点过于重复.我确信有一种方法可以将它重构为3个共同递归的函数addDict
,addList
并且addElse
,但是我的大脑被卡住了.有帮助吗?
此外,任何摆脱offset +
每一行的东西的方法都会很好.
注意:我选择了这些语义,因为我试图匹配org.json中json-to-xml转换器的行为,我在项目的不同部分使用它.如果你到这个页面只是寻找xml转换器的字典,那么在一些答案中有一些非常好的选择.(特别是pyfo).
>>> from pyfo import pyfo >>> d = ('site', { 'name': 'stackoverflow', 'blogger': [ 'Jeff', 'Joel' ] } ) >>> result = pyfo(d, pretty=True, prolog=True, encoding='ascii') >>> print result.encode('ascii', 'xmlcharrefreplace')Jeff Joel stackoverflow
要安装pyfo:
$ easy_install pyfo