我有以字典格式存储的数据需要写入xml文件格式..
我正在尝试使用dict2xml模块..
我看到字典中的项目顺序未在xml文件中维护。
我正在使用的字典输入是OrderedDict()。
可能是什么原因。还可以使用除dict2xml以外的任何其他更好的模块吗?
例如......
$ ipython
Python 3.5.1 (default, Oct 28 2016, 14:29:41)
Type "copyright", "credits" or "license" for more information.
IPython 5.2.2 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: from collections import OrderedDict
In [2]: myDict = OrderedDict()
In [3]: myDict['simpleVal'] = 1
In [4]: dictVal = OrderedDict()
In [5]: dictVal['simpleVal1'] = 2
In [6]: dictVal['listVal'] = ['a','b','c']
In [7]: myDict['dictVal'] = dictVal
In [8]: myDict['listVal1'] = ['d','e','f','g']
In [9]: myDict
Out[9]:
OrderedDict([('simpleVal', 1),
('dictVal',
OrderedDict([('simpleVal1', 2), ('listVal', ['a', 'b', 'c'])])),
('listVal1', ['d', 'e', 'f', 'g'])])
In [10]: from dict2xml import dict2xml
In [11]: dict2xml(myDict)
Out[11]: '<dictVal>\n <listVal>a</listVal>\n <listVal>b</listVal>\n <listVal>c</listVal>\n <simpleVal1>2</simpleVal1>\n</dictVal>\n<listVal1>d</listVal1>\n<listVal1>e</listVal1>\n<listVal1>f</listVal1>\n<listVal1>g</listVal1>\n<simpleVal>1</simpleVal>'
您可以看到的实际输出是:
<dictVal>
<listVal>a</listVal>
<listVal>b</listVal>
<listVal>c</listVal>
<simpleVal1>2</simpleVal1>
</dictVal>
<listVal1>d</listVal1>
<listVal1>e</listVal1>
<listVal1>f</listVal1>
<listVal1>g</listVal1>
<simpleVal>1</simpleVal>
但按照我的订单,我已经给出了我的输出
<simpleVal>1</simpleVal>
<dictVal>
<simpleVal1>2</simpleVal1>
<listVal>a</listVal>
<listVal>b</listVal>
<listVal>c</listVal>
</dictVal>
<listVal1>d</listVal1>
<listVal1>e</listVal1>
<listVal1>f</listVal1>
<listVal1>g</listVal1>
答案 0 :(得分:1)
问题是dict2xml
在将名称转换为xml之前对名称进行排序。
我无法说明原因......我不知道这种行为是否适用于任何地方。
来自code:
def convert(self):
...
if typ == 'mapping':
for key in sorted(data): <--- SORTING THE KEYS!
item = data[key]
children.append(Node(key, "", item, iterables_repeat_wrap=self.iterables_repeat_wrap))