使用python

时间:2015-07-24 18:43:19

标签: python xml xpath lxml elementtree

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

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

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

我可以使用find命令找到单个“node 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工具?

3 个答案:

答案 0 :(得分:4)

你需要向上移动一级

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

答案 1 :(得分:0)

您也可以使用

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

答案 2 :(得分:-1)

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