2

以下代码采用 XML 并将其转换为字典:

import xml.etree.cElementTree as et
tree = et.parse(path_to_xml)
root = tree.getroot()      
xml_dict = etree_to_dict(root)

在哪里:

def etree_to_dict(t):
    d = {t.tag: {} if t.attrib else None}
    children = list(t)
    if children:
        dd = defaultdict(list)

        for dc in map(etree_to_dict, children):
            for k, v in dc.iteritems():
                dd[k].append(v)
        d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}

    if t.attrib:
        d[t.tag].update(('@' + k, v) for k, v in t.attrib.iteritems())
    if t.text:
        text = t.text.strip()
        if children or t.attrib:
            if text:
              d[t.tag]['#text'] = text
        else:
            d[t.tag] = text
    return d

但是,上面的函数返回一个无序的字典。我希望它改为返回有序字典。我不清楚如何替换一些字典理解defaultdict对此的要求。

输入的一个例子可能是这个:http ://www.w3schools.com/xml/plant_catalog.xml

关于如何更换的任何想法

4

1 回答 1

3

用实例上的等效操作替换dict理解和操作是相当简单的。请注意,s 比常规 dicts(和s)慢一点,但只有一个常数因素(它们仍然具有相同的 big-O 性能)。defaultdictcollections.OrderedDictOrderedDictdefaultdict

不是 a defaultdict,而是创建一个OrderedDict并在必要时使用setdefault来创建默认值:

dd = OrderedDict()

for dc in map(etree_to_dict, children):
    for k, v in dc.iteritems():
        dd.setdefault(k, []).append(v)

OrderedDict用产生元组的列表或生成器表达式的调用替换 dict 理解(key, value),例如:

d = OrderedDict([(t.tag, OrderedDict((k, v[0] if len(v) == 1 else v)
                                     for k, v in dd.iteritems()))])
于 2014-05-02T00:21:22.967 回答