使用Python时保持父子关系';s ElementTree.iter()
我有以下标记:使用Python时保持父子关系';s ElementTree.iter(),python,relationship,parent,elementtree,Python,Relationship,Parent,Elementtree,我有以下标记: <a> <b> <c> <d> <e> </b> <f> <g> </f> </a> 我需要找到一种方法来保持父母和孩子之间的关系,例如,我想知道“f”父母是“a”。到目前为止,我唯一能想到的方法是每次我找到父节点:len(list(elem))>0,我将该节点添加到列表中,并跟踪节点的当前“级别”以建立该关系。
<a>
<b>
<c>
<d>
<e>
</b>
<f>
<g>
</f>
</a>
我需要找到一种方法来保持父母和孩子之间的关系,例如,我想知道“f”父母是“a”。到目前为止,我唯一能想到的方法是每次我找到父节点:len(list(elem))>0,我将该节点添加到列表中,并跟踪节点的当前“级别”以建立该关系。我不觉得这个解决方案很优雅,我相信有一个更简单的解决方案,不幸的是我还没有找到:/,我希望有人能给我一些启示:D
另外,在有人评论“在提问之前使用搜索”之前,我已经阅读了每一篇与我试图做的事情相关的帖子,比如:
提前感谢您可以使用字典,这对树状结构更有利。目标是使字典的键成为父项,值是子项的列表。以下是您如何做到这一点:
def get_children(parent):
return [child for child in parent]
def get_parent_children_mapping(tree):
return {parent: get_children(parent) for parent in tree.iter()}
示例用法如下:
import xml.etree.ElementTree as ET
def get_children(parent):
return [child for child in parent]
def get_parent_children_mapping(tree):
return { parent: get_children(parent) for parent in tree.iter() }
if __name__ == "__main__":
s = """
<a>
<b>
<c>Hello</c>
<d>World</d>
<e>Goodbye</e>
</b>
<f>
<g>Hmmm...</g>
<c>Hello</c>
</f>
</a>
"""
tree = ET.fromstring(s)
for parent, children in get_parent_children_mapping(tree).items():
if children:
print("{0} -> {1}".format(parent, children))
将xml.etree.ElementTree作为ET导入
def get_子项(父项):
返回[父对象中的子对象对子对象]
def get_parent_children_映射(树):
返回{parent:get_tree.iter()中父级的子级(parent)}
如果名称=“\uuuuu main\uuuuuuuu”:
s=”“”
。请确保您的XML是有效的。使用字典?父项是关键,子项是值。如果子项只能有一个父项,这在XML中应该是正确的。以我的标记为例,在我的情况下,我可以出现在中,但不经常出现,但也可能发生。如果节点可以出现重复,会发生什么情况?这可能发生在子项和父项上(在我的例子中)如果存在嵌套,则必须使用递归。您的示例没有嵌套,因此我没有添加它。我在代码上进行了测试,并且子-父关系看起来都是混乱的。我不能在代码上使用嵌套,因为我需要对节点进行排序(深度优先样式),这是一开始我认为列表格式很酷的原因之一。@VitorMexia。
import xml.etree.ElementTree as ET
def get_children(parent):
return [child for child in parent]
def get_parent_children_mapping(tree):
return { parent: get_children(parent) for parent in tree.iter() }
if __name__ == "__main__":
s = """
<a>
<b>
<c>Hello</c>
<d>World</d>
<e>Goodbye</e>
</b>
<f>
<g>Hmmm...</g>
<c>Hello</c>
</f>
</a>
"""
tree = ET.fromstring(s)
for parent, children in get_parent_children_mapping(tree).items():
if children:
print("{0} -> {1}".format(parent, children))