I'm not very experienced with xpath, but this link suggests a way to build
a parent-child map once that you can use:
http://effbot.org/zone/element.htm#accessing-parents
root = ET.fromstring(xmldata)
parent_map = dict((c, p) for p in root.getiterator() for c in p)
...
for rev in review:
parent = parent_map[rev]
...
If you are using the newest cElementTree from
pypi<http://pypi.python.org/pypi/cElementTree/1.0.2-20050302> then
you can also modify your xpath to directly filter the id attribute and save
the loop:
review = root.findall('./ep_150/stage/review[@id="p4645"]')
[" - ".join((parent_map[r].get('name'), r.get('name'))) for r in review]
# ['blk - R3', 'pri - R5']
And if you have lxml installed, it seems the Element objects let you
directly access the parent:
review = root.xpath('./ep_150/stage/review[@id="p4645"]')
[" - ".join((r.getparent().get('name'), r.get('name'))) for r in review]
# ['blk - R3', 'pri - R5']
-- justin
On Thu, Nov 1, 2012 at 9:28 AM, damon shelton <[email protected]>wrote:
> perhaps loop through each stage and check its children
>
>
> root = ET.fromstring(xmldata)
>
> stages = root.findall("./ep_150/stage")
>
> print '\n\nreviews for id=p4645\n'
>
> for stage in stages:
>
> children = stage.getchildren()
>
> for child in children:
>
> if child.attrib['id']=='p4645':
>
> print('%s - %s' % (stage.attrib['name'],
> child.attrib['name']))
>
>
> On Thu, Nov 1, 2012 at 12:23 AM, PBLN RAO <[email protected]> wrote:
>
>>
>>
>> I am trying to retrieve data from xml.etree.cElementTree.
>>
>> i have the following code
>>
>> *Code Snippet*
>>
>>
>> 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)
>> 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'])
>>
>> with the above code i am getting the result as below
>>
>> reviews for id=p4645
>>
>> R3
>>
>> R5
>>
>> *But i need the output as*
>>
>> reviewes for id=p4645
>>
>> blk - R3
>>
>> pri - R5
>>
>> i.e, i need the parent tag along with the element using Xpaths.
>>
>> I know its possible if i iterate through entire tree. But need to use
>> more loops.
>>
>> --
>> view archives: http://groups.google.com/group/python_inside_maya
>> change your subscription settings:
>> http://groups.google.com/group/python_inside_maya/subscribe
>>
>
> --
> view archives: http://groups.google.com/group/python_inside_maya
> change your subscription settings:
> http://groups.google.com/group/python_inside_maya/subscribe
>
--
view archives: http://groups.google.com/group/python_inside_maya
change your subscription settings:
http://groups.google.com/group/python_inside_maya/subscribe