从Word XML嵌套字典

时间:2016-02-10 14:59:37

标签: python xml lxml

我有一个带有表单的word文件。目标是扫描XML(使用lxml)并生成{formTag:formValue}的字典。它变得有点复杂,因为表格可以嵌套在其他重复形式中,这些形式最初会产生

{topLevelFormTag:formTag1+formValue1+formTag2+formValue2,  formTag1:formValue1, formTag2:formValue2}

然而,目标是最终

{topLevelFormTag:{formTag1:formValue1, formTag2:formValue2}}

当我搜索文件(for field in xmlroot.iter(TAG_FIELD):)时,我会填写两个词典; parentsdescendantsparents[field] = field.getparents()和descendants[field] = list(field.iterdescendants())。下面是我将所有字段的字典折叠到嵌套字典中的方法。如果只有一个级别的嵌套,它可以正常工作,但是,它会失败并增加其他级别。它失败是因为嵌套表单位于所有上述级别的后代,因此它可以作为任何上层的子项放置。

for ptag in parents:
    for dtag in descendants:
        if parents[ptag] in descendants[dtag]:
            print "{} is a descendant of {}".format(ptag, dtag)
            try:
                fields[dtag][ptag] = fields[ptag]
                del fields[ptag]
            except TypeError:
                fields[dtag] = {ptag: fields[ptag]}
                del fields[ptag]
            except KeyError:
                print "!!!{}:{}!!!".format(ptag, dtag)

如何确定放置字段的最低级别,以便我的字典正确嵌套?

1 个答案:

答案 0 :(得分:0)

在任何字典中找到最后一个嵌套,你必须使用递归关系:

def last_nest(somedict):
    for i in somedict:
        if type(somedict[i]) is dict:
            return last_nest(somedict[i])
    return somedict

test = {"a":{"b":{"c":123}}}
print last_nest(test)

因此,您需要考虑的主要问题是如何终止递归关系以便最终得到您想要的字典。