为什么dict2xml没有维护与输入字典中相同的顺序?

时间:2017-02-27 07:47:26

标签: python-3.x

我有以字典格式存储的数据需要写入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>

1 个答案:

答案 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))