使用 python 从 XML 中的子项中查找父项

Finding parent from child in XML using python

我是新手,所以请耐心等待。

使用 ETree 和 Python 2.7,我正在尝试解析我没有生成的大型 XML 文件。基本上,该文件包含包含在大量体积中的体素组。一般格式为:

<things>
    <parameters>
        <various parameters> 
    </parameters>
    <thing id="1" comment="thing1">
        <nodes>
            <node id="1" x="1" y="1" z="1"/>
            <node id="2" x="2" y="2" z="2"/>
        </nodes>
        <edges>
            <edge source="1" target="2"/>
        </edges>
    </thing>
    <thing id="N" comment="thingN">
        <nodes>
            <node id="3" x="3" y="3" z="3"/>
            <node id="4" x="4" y="4" z="4"/>
        </nodes>
        <edges>
            <edge source="3" target="4"/>
        </edges>
    </thing>
    <comments>
        <comment node="1" content="interesting feature"/>
        <comment node="4" content="interesting feature"/>
    </comments>
</things>

一个"node"包含一个体素的坐标,一个"thing"是一组体素。 "comments" 用于突出显示感兴趣的节点。

我可以使用查找命令找到个人 "node ids" 的属性,例如:

for elem in things.iterfind('thing/nodes/node[@id="221"]'):
    x = int(elem.get('x'))

我希望能够确定任何 "node id" 所属的 "thing id"(例如,节点 3 在事物 N 中)。我知道我可以使用 for 循环来执行此操作,遍历事物然后遍历节点,但我认为应该有某种方法可以通过从子节点中找到父节点来更简单地完成此操作。

我试过以下所有变体:

elem.find(..)

我能想到的,但我得到了

"None Type" or SyntaxError("cannot use absolute path on element")

我也尝试过 lxml getparent() 命令,正如在此处对类似查询的回应所建议的那样:Get parent element after using find method (xml.etree.ElementTree) 但无济于事。

我是否必须在此文件中定义 类 才能完全访问 XPath 工具?

你需要向上遍历一层

for elem in things.iterfind('thing/nodes/node[@id="1"]'):
    # get parent of node - nodes
    print elem.getparent() 
    # get grand parent of node - thing
    print elem.getparent().getparent()
    # now lets get the thing id
    print elem.getparent().getparent().attrib.get('id')

您也可以使用

for elem in things.iterfind('thing/nodes/node[@id="1"]'):
   # get parent of nodes, i.e. ancestor of node
   parent = elem.xpath('ancestor::thing')[0]
   # get the thing id
   print parent.get('id')

这样就不用再敲两次getparent(),更清楚谁是祖先

for all_tags in xmlTree.findall('.//'): parent=xmlTree.find('.//%s/..' % all_tags.tag)