这真的是一件小事:我有这个将 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' ] } }
到:
<site>
<name>stackoverflow</name>
<blogger>jeff</blogger>
<blogger>joel</blogger>
</site>
它可以工作,但是 addDict
函数看起来有点太重复了。我确信有一种方法可以将它重构为 3 个名为 addDict
、addList
和 addElse
的联合递归函数,但我的大脑卡住了。有帮助吗?
此外,任何摆脱每一行中的 offset +
的方法都会很好。
注意:我选择这些语义是因为我试图匹配 json-to-xml converter 的行为在 org.json ,我在项目的不同部分使用它。如果您访问此页面只是为了寻找字典到 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>
安装pyfo :
$ easy_install pyfo
关于python - 在 python 中重构这个 dictionary-to-xml 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/494881/