当前位置:  开发笔记 > 编程语言 > 正文

在python中重构这个字典到xml的转换器

如何解决《在python中重构这个字典到xml的转换器》经验,为你挑选了1个好方法。

这是一件小事,真的:我有这个函数将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"" % 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"" % name)
                    else:
                        lines.append(offset + u"<%s>%s" % (name, escape(unicodify(item)), name))
            else:
                lines.append(offset + u"<%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).



1> jfs..:
>>> 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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有