Ya, I think I wasn't clear about that part. The cElementTree that is shipped with python isn't the one that has the full xpath support I mentioned. You just need to install the newer one (or lxml if you want that).
You can use easy_install or pip to get them from pypi easy_install cElementTree pip install cElementTree pip install lxml If you don't have easy_install you can get it by downloading this: http://peak.telecommunity.com/dist/ez_setup.py And doing: python ez_setup.py Then you will have easy_install. You could further get pip and just use that if you want: easy_install pip On Fri, Nov 2, 2012 at 2:09 AM, PBLN RAO <[email protected]> wrote: > thx justin, > > parent map worked for me. > > but i think your 2nd option below dont work in python 2.6. > bcoz the link which gave is cElementree 1.0.2 and in the site it says > cElementree 1.0.5 comes with python 2.5 onwards. i am using python 2.6.4. > even in python 2.6 xpath did not work directly to filter the attributes. > > i have posted a question on this on > stackoverflow<http://stackoverflow.com/questions/13171915/how-to-get-parent-tag-while-using-xpaths-in-xml-etree-elementree-with-python-2-6> > > > 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'] >> > > > On Thursday, November 1, 2012 10:49:41 PM UTC+5:30, Justin Israel wrote: > >> 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<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<http://groups.google.com/group/python_inside_maya> >>>> change your subscription settings: http://groups.google.com/** >>>> group/python_inside_maya/**subscribe<http://groups.google.com/group/python_inside_maya/subscribe> >>>> >>> >>> -- >>> view archives: >>> http://groups.google.com/**group/python_inside_maya<http://groups.google.com/group/python_inside_maya> >>> change your subscription settings: http://groups.google.com/** >>> group/python_inside_maya/**subscribe<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
