【发布时间】:2012-03-22 16:53:51
【问题描述】:
我有一个包含项目和标签的元素。元素可以包含更多的元素,这些元素也有项目和标签,这些元素也可以有项目和标签。事先我不知道第一个元素中有多少“嵌套”元素。
我想以元素为键将标签和项目保存在字典中,如果元素具有“嵌套”元素,我想将该元素及其信息保存在与其“父元素”相同的字典条目中'。
我到目前为止的代码只有在第一个元素有嵌套元素并且嵌套元素中没有另一个嵌套元素时才有效。这是代码:
def getAllNestedElementInformation(element, nestedDict=None):
infoDict = {'tagName':element.tag}
infoDict.update(getItems(element))
if nestedDict == None:
nestedDict = infoDict
else:
nestedDict['nestedElement'][element] = infoDict
print nestedDict
for nestedElement in element:
nestedDict.update({'nestedElement':collections.defaultdict(dict)})
getAllNestedElementInformation(nestedElement, nestedDict=nestedDict)
我想拥有
{'name':'scan', 'nestedElement':{'name':'scanwindow', 'nestedElement':{'name:'cvParam'}}}
但我不会走得更远
{'name':'scan', 'nestedElement':{'name:'scanwindow'}}
因为我不知道如何在“nestedElement”字典中映射下一个nestedElement。
举例说明我现在拥有什么以及我想拥有什么,当我打印 nestedDict 时,我得到:
{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: {'tagName': 'scan'}}, 'tagName': 'spectrum', 'id': '1'}
{'index': '0', 'nestedElement': {<Element 'cvParam' at 0x80682a0>: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}
我想拥有:
{'index': '0', 'nestedElement': {<Element 'scan' at 0x8068180>: 'tagName': 'scan', 'nestedElement: {'name': 'scan start time', 'unitName': 'second', 'tagName': 'cvParam', }}, 'tagName': 'spectrum', 'id': '1'}
【问题讨论】:
-
<Element 'scan' at 0xwhatever>是有效的可散列类型吗?我觉得 python 不会让你用它作为键。 -
您在使用 xml 吗?您想通过这样做解决什么大问题?
-
是的,我正在使用 xml,我想在不读取整个 xml 文件的情况下获取 xml 树的一个分支中的所有嵌套元素。
-
@NiekdeKlein:如果你不阅读整个文件,你怎么知道你有所有嵌套元素?
标签: python recursion dictionary