2015-04-04 95 views
-1

我有以下XML文件:如何遞歸迭代有序字典?

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author a_id="a101"> 
     <first>Gambardella </first> 
     <last> Matthew</last> 
     <email> [email protected]</email> 
     </author> 
     <title>XML Developer's Guide</title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk112"> 
     <author a_id='a007'> 
     <first>Galos</first> 
     <last> Mike</last> 
     <email>[email protected]</email> 
    </author> 
     <title>Visual Studio 7: A Comprehensive Guide</title> 
     <genre>Computer</genre> 
     <price>49.95</price> 
     <publish_date>2001-04-16</publish_date> 
     <description>Microsoft Visual Studio 7 is explored in depth, 
     looking at how Visual Basic, Visual C++, C#, and ASP+ are 
     integrated into a comprehensive development 
     environment.</description> 
    </book> 
</catalog> 

我已經使用xmltodict模塊,它返回一個有序詞典文件轉換成一個字典。此字典包含詞典中的字典作爲值。

from xmltodict import parse 
data=open(file_name).read().replace('\n', '') 
xml_dict = parse(data) 

現在,我想在遞歸的方式直至打印xml_dict一定深度的「鍵::值」格式。

任何人都可以告訴我如何以遞歸的方式迭代這個字典。

我已經試過代碼:

def print_dict(_dict): 
    for k, v in _dict.items(): 
    if hasattr(v, 'items'): 
      print_dict(v) 
    elif isinstance(v, list): 
     for i in v: 
      print_dict(dict(i)) 
    else: 
      print "(%s::%s)"%(k,v) 

但與此代碼書標籤去錯過。

那麼,什麼將成爲該解決方案.......

+0

'elif的isinstance(V,列表):'然後下面的'print_dict(字典(I)) '。這不應該只是'印刷v(i)'? – Evert 2015-04-04 17:56:04

+0

任何你不能使用XML解析器的原因? – salparadise 2015-04-04 19:11:19

+0

請顯示你想輸出的樣子。 – martineau 2015-04-06 01:26:07

回答

3

我認爲這個問題是你不使用你的遞歸情況下,k鍵值。我不確切知道你希望輸出的樣子,但我懷疑你可以通過在ifelif塊中添加打印語句來使它工作。

這裏有一個版本,使輸出更漂亮通過添加一個可選的 「縮進」 參數看:

def print_dict(_dict, indent=""): 
    for k, v in _dict.items(): 
     if hasattr(v, 'items'): 
      print "%s(%s::" % (indent, k) 
      print_dict(v, indent + " ") 
      print "%s)" % indent 
     elif isinstance(v, list): 
      print "%s(%s::" % (indent, k) 
      for i in v: 
       print_dict(dict(i), indent + " ") 
      print "%s)" % indent 
     else: 
      print "%s(%s::%s)" % (indent, k, v)