将Python字典序列化为XML

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

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

有一个huTools.structured.dict2xml试图在精神上兼容simplejson 。 你可以给它提示如何包装嵌套的子结构。 请检查huTools.structured.dict2et的文档,如果huTools.structured.dict2et返回string,则返回ElementTree对象。

 >>> 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>''' 

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

 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() 

我写了一个简单的函数,将字典序列化为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/find

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

Python中的大多数对象都被表示为下面的string:

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

所以这就类似于问如何将字典转换为XML。 有一些工具可以将dict从XML转换成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工具手册

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

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