2016-02-10 136 views
2

我有一個帶有窗體的字文件。目標是掃描XML(使用lxml)並生成{formTag:formValue}字典。它得到稍微更加複雜,因爲形式可以嵌套在其它重複形式,其initally產生從Word XML嵌套字典

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

如何確定最下方水平放置在這樣一個領域,我的字典裏是正確的嵌套?

回答

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) 

所以,你需要考慮的主要事情是如何終止,以獲得字典的遞推關係是你想在最後。