Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python时保持父子关系';s ElementTree.iter()_Python_Relationship_Parent_Elementtree - Fatal编程技术网

使用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))