我是这个论坛的新手。
我正在尝试从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
即,我需要元素的父标签
答案 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']