gpt4 book ai didi

python - 在 python 中重构这个 dictionary-to-xml 转换器

转载 作者:数据小太阳 更新时间:2023-10-29 02:15:17 26 4
gpt4 key购买 nike

这真的是一件小事:我有这个将 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 个名为 addDictaddListaddElse 的联合递归函数,但我的大脑卡住了。有帮助吗?

此外,任何摆脱每一行中的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com