如何在xml.etree.elementtree和python 2.6.4中使用XPath时获取父标记

时间:2012-11-01 06:17:09

标签: python xml.etree

我是这个论坛的新手。

我正在尝试从xml.etree.cElementTree中检索数据。

我有以下代码

代码段

import xml.etree.cElementTree as ET

xmldata ="""
<pipeline>
    <ep_150>
        <stage name="lay" longname="layout" department="layout" process="production">
            <review name="R1" reviewer="sridhar reddy" role="supervisor" id="p1234">
            </review>
        </stage>
        <stage name="lip" longname="lipsync" department="lipsync" process="production">
            <review name="R2" reviewer="someone" role="supervisor" id="p2345">
            </review>
        </stage>
        <stage name="blk" longname="blocking" department="animation" process="production">
            <review name="R3" reviewer="sudeepth" role="supervisor" id="p4645" dependson='R1'>
            </review>
            <review name="R4" reviewer="chandu" role="director" id="p5678">
            </review>
        </stage>
        <stage name="pri" longname="primary" department="animation" process="production">
            <review name="R5" reviewer="sudeepth" role="supervisor" id="p4645" style="dep" >
            </review>
            <review name="R6" reviewer="sudeepth" role="bld_supervisor" id="p2556" style="dep">
            </review>
        </stage>
        <stage name="sec" longname="secondary" department="animation" process="production">
            <review name="R7" reviewer="sha" role="supervisor" id="p1234" style="dep">
            </review>
            <review name="R8" reviewer="chandu" role="director" id="p5678">
            </review>
        </stage>
    </ep_150>
</pipeline>
"""
root = ET.fromstring(xmldata)

stages = root.findall("./ep_150/stage")

print 'Stages in animation department....\n'

for stage in stages:

    if stage.attrib['department']=='animation':
        print stage.attrib['name']

review = root.findall("./ep_150/stage/review")        

print '\n\nreviews for id=p4645\n'

for rev in review:

    if rev.attrib['id']=='p4645':
        print (rev.attrib['name'])

使用上面的代码我得到如下结果

动画部门的阶段......

BLK

PRI

对于id = p4645

的评论

R3

R5

但我需要下半年的输出为

审核了id = p4645

blk - R3

pri - R5

即,我需要元素的父标签

1 个答案:

答案 0 :(得分:2)

孩子们不了解他们的父母,但父母知道他们的孩子,所以你必须相应地构建你的代码: -

stages = root.findall("./ep_150/stage")        

print '\n\nreviews for id=p4645\n'

for stage in stages:
    for rev in stage.findall('review'):
        if rev.attrib['id']=='p4645':
            print stage.attrib['name'], rev.attrib['name']

请参阅http://effbot.org/zone/element.htm#accessing-parents

与答案无关。如果您愿意,可以在findall参数中移动那些: -

root = ET.fromstring(xmldata)

stages = root.findall("./ep_150/stage[@department='animation']")

print 'Stages in animation department....\n'

for stage in stages:
    print stage.attrib['name']

stages = root.findall("./ep_150/stage")        

print '\n\nreviews for id=p4645\n'

for stage in stages:
    for rev in stage.findall("review[@id='p4645']"):
        print stage.attrib['name'], rev.attrib['name']