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

标签 python xml dry

这真的是一件小事:我有这个将 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/

相关文章:

java - 递归DRY代码,计算月份中的天数,Java

ruby - 干掉这段 Ruby 代码

python - 使用 np.where 从子数组中查找元素

c# - 如何在 dataGrid 中将 XML 中的数据排序为数字

android - 有没有更简单/更好的方法在我的 TextView 周围放置边框/轮廓?

c# - 在 C# 中使用 IDisposable 的模板方法模式

Python根据索引添加两个数据帧(已编辑)

python - 模糊比较两列

python - Transformers 库中 Pegasus 模型的单词/句子的最大输入长度

android - xml数据存储的最佳方法