我有以下XML文件:
<?xml version="1.0"?>
<catalog>
<book id="bk101">
<author a_id="a101">
<first>Gambardella </first>
<last> Matthew</last>
<email> matthew@standford.org</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>mike@gmail.com</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
以“key :: value”格式打印到给定深度。
任何人都可以告诉我如何以递归方式迭代这个字典。
我试过了代码:
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 :(得分:3)
我认为问题在于您在递归情况下没有使用k
键值。我不确切地知道您希望输出的外观,但我怀疑您可以通过向if
和elif
块添加打印语句来使其工作。
这是一个通过添加可选的“缩进”参数使输出更加美观的版本:
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)