这是一件小事,真的:我有这个函数将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)
Run Code Online (Sandbox Code Playgroud)
例如,它会转换此字典
{ 'site': { 'name': 'stackoverflow', 'blogger': [ 'Jeff', 'Joel' ] } }
Run Code Online (Sandbox Code Playgroud)
至:
<site>
<name>stackoverflow</name>
<blogger>jeff</blogger>
<blogger>joel</blogger>
</site>
Run Code Online (Sandbox Code Playgroud)
它有效,但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')
<?xml version="1.0" encoding="ascii"?>
<site>
<blogger>
Jeff
Joel
</blogger>
<name>stackoverflow</name>
</site>
Run Code Online (Sandbox Code Playgroud)
要安装pyfo:
$ easy_install pyfo
Run Code Online (Sandbox Code Playgroud)