将 Python 字典序列化为 XML [关闭]

Posted

技术标签:

【中文标题】将 Python 字典序列化为 XML [关闭]【英文标题】:Serialize Python dictionary to XML [closed] 【发布时间】:2010-11-04 10:17:52 【问题描述】:

有一个名为“simplejson”的简单 JSON 序列化模块,可以轻松地将 Python 对象序列化为 JSON。

我正在寻找可以序列化为 XML 的类似模块。

【问题讨论】:

【参考方案1】:

http://code.activestate.com/recipes/415983/

http://sourceforge.net/projects/pyxser/

http://soapy.sourceforge.net/

http://www.ibm.com/developerworks/webservices/library/ws-pyth5/

http://gnosis.cx/publish/programming/xml_matters_1.txt

【讨论】:

> code.activestate.com/recipes/415983 这个不序列化为 XML 只是编组格式。而且我也不喜欢 sys.exit on Exception。 > sourceforge.net/projects/pyxser 这个不是BSD。对不起,我忘了提,我正在寻找 python 模块或 BSD,所以我可以用我的 BSD 软件分发。最后 2 个 - 对于 web 服务,我正在寻找常规 XML 序列化器。 zdmytriv:您可以使用您的 BSD 代码分发 LGPL 库而无需承担任何责任。 @nosklo:我不知道你能做到这一点。现在我知道了,谢谢。【参考方案2】:

huTools.structured.dict2xml 在精神上试图与simplejson 兼容。你可以给它提示如何包装嵌套的子结构。检查huTools.structured.dict2et 的文档,它返回ElementTree 对象,而不是dict2xml 返回的字符串。

>>> data = "kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,
... "ort": u"Hücksenwagen",
... "positionen": ["menge": 12, "artnr": "14640/XL", "posnr": 1,],
... "versandeinweisungen": ["guid": "2103839-XalE", "bezeichner": "avisierung48h",
...                          "anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren",
... ]

>>> print ET.tostring(dict2et(data, 'kommiauftrag',
... listnames='positionen': 'position', 'versandeinweisungen': 'versandeinweisung'))
'''<kommiauftrag>
<anliefertermin>2009-11-25</anliefertermin>
<positionen>
    <position>
        <posnr>1</posnr>
        <menge>12</menge>
        <artnr>14640/XL</artnr>
    </position>
</positionen>
<ort>H&#xC3;&#xBC;cksenwagen</ort>
<versandeinweisungen>
    <versandeinweisung>
        <bezeichner>avisierung48h</bezeichner>
        <anweisung>48h vor Anlieferung unter 0900-LOGISTIK avisieren</anweisung>
        <guid>2103839-XalE</guid>
    </versandeinweisung>
</versandeinweisungen>
<prioritaet>7</prioritaet>
<kommiauftragsnr>2103839</kommiauftragsnr>
</kommiauftrag>'''

【讨论】:

huTools 与 Python 3 ('dict' object has no attribute 'iteritems') 不兼容。 这个东西的许可条款是什么?我可以将它用作我的商业应用程序吗?【参考方案3】:

试试这个。唯一的问题我不使用属性(因为我不喜欢它们)dict2xml on pynuggets.wordpress.com dict2xml on activestate

from xml.dom.minidom import Document
import copy

class dict2xml(object):
    doc     = Document()

    def __init__(self, structure):
        if len(structure) == 1:
            rootName    = str(structure.keys()[0])
            self.root   = self.doc.createElement(rootName)

            self.doc.appendChild(self.root)
            self.build(self.root, structure[rootName])

    def build(self, father, structure):
        if type(structure) == dict:
            for k in structure:
                tag = self.doc.createElement(k)
                father.appendChild(tag)
                self.build(tag, structure[k])

        elif type(structure) == list:
            grandFather = father.parentNode
            tagName     = father.tagName
            grandFather.removeChild(father)
            for l in structure:
                tag = self.doc.createElement(tagName)
                self.build(tag, l)
                grandFather.appendChild(tag)

        else:
            data    = str(structure)
            tag     = self.doc.createTextNode(data)
            father.appendChild(tag)

    def display(self):
        print self.doc.toprettyxml(indent="  ")

if __name__ == '__main__':
    example = 'auftrag':"kommiauftragsnr":2103839, "anliefertermin":"2009-11-25", "prioritaet": 7,"ort": u"Huecksenwagen","positionen": ["menge": 12, "artnr": "14640/XL", "posnr": 1,],"versandeinweisungen": ["guid": "2103839-XalE", "bezeichner": "avisierung48h","anweisung": "48h vor Anlieferung unter 0900-LOGISTIK avisieren",]
    xml = dict2xml(example)
    xml.display()

【讨论】:

这里是创建另一个dict2xml实例xml.dom.HierarchyRequestErr: two document elements disallowed的问题,所以我添加了unlink方法:def unlink(self): self.doc.unlink()【参考方案4】:

Python 中的大多数对象在下面都表示为 dicts:

>>> class Fred(object) : 
...    def __init__(self, n) : self.n = n 
... 
>>> a = Fred(100)
>>> print a.__dict__ 
'n': 100

所以这类似于询问如何将 dicts 转换为 XML。 有用于将 dict 转换为 XML 的工具:

http://www.picklingtools.com

这是一个简单的例子:

    >>> import xmltools

    >>> d = 'a':1, 'b':2.2, 'c':'three' 
    >>> xx = xmltools.WriteToXMLString(d)
    >>> print xx
    <?xml version="1.0" encoding="UTF-8"?>
    <top>
      <a>1</a>
      <b>2.2</b>
      <c>three</c>
    </top>

网站上有很多文档显示示例:

XML Tools Manual

在 dicts 和 XML 之间进行“精确”转换是很困难的:什么是列表?你用属性做什么?你如何处理数字键?这些问题很多都已经解决了 并在 XML 工具文档(上文)中进行了讨论。

速度对你很重要吗?还是易用性很重要? 有一个纯 C++ 模块(全部用 C++ 编写)、一个纯 Python 模块(全部用 Python 编写)和一个 Python C 扩展模块(用 C++ 编写,但经过包装以便 Python 可以调用它)。 C++ 和 Python C 扩展模块的速度要快几个数量级,但当然需要编译才能开始。 Python 模块应该可以正常工作,但速度较慢:

【讨论】:

【参考方案5】:

我编写了一个将字典序列化为 xml 的简单函数(不到 30 行)。

用法:

mydict = 
    'name': 'The Andersson\'s',
    'size': 4,
    'children': 
        'total-age': 62,
        'child': [
            
                'name': 'Tom',
                'sex': 'male',
            ,
            
                'name': 'Betty',
                'sex': 'female',
            
        ]
    ,

print(dict2xml(mydict, 'family'))

结果:

<family name="The Andersson's" size="4">
        <children total-age="62">
                <child name="Tom" sex="male"/>
                <child name="Betty" sex="female"/>
        </children>
</family>

完整的源代码(包括一个例子)可以在https://gist.github.com/reimund/5435343/找到

注意:此函数会将字典条目序列化为属性而不是文本节点。修改它以支持文本将非常容易。

【讨论】:

以上是关于将 Python 字典序列化为 XML [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Python 字典序列化为字符串,然后再返回字典?

python 将SQLAlchemy Model序列化为字典(用于JSON输出)并从字典属性更新Model。

python 读取csv文件并将其序列化为字典列表的脚本{column:value}然后可以将dicts用于计数或cr

Gson 可以生成 XML 吗? [关闭]

Unity 将嵌套字典序列化为 JSON

Newtonsoft Json 将字典反序列化为来自 DataContractJsonSerializer 的键/值列表