我是新手,所以请耐心等待。
使用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工具?
答案 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)