【问题标题】:Finding parent from child in XML using python使用python在XML中从孩子中查找父母
【发布时间】:2015-10-15 13:04:35
【问题描述】:

我是新手,请耐心等待。

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

一个“节点”包含一个体素的坐标,一个“事物”是一组体素。 “cmets”用于突出显示感兴趣的节点。

我可以使用 find 命令查找单个“节点 ID”的属性,例如:

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

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

我已经尝试了以下所有变体:

elem.find(..)

我能想到的,但我得到了任何一个

“无类型”或 SyntaxError("不能在元素上使用绝对路径")

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

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

【问题讨论】:

标签: python xml xpath lxml elementtree


【解决方案1】:

你需要向上遍历一个级别

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')

【讨论】:

    【解决方案2】:

    你也可以使用

    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(),更清楚谁是祖先。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-10
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多