[EMAIL PROTECTED] wrote: > ============================================================ > <data> > <fonts> > <fontData embed="true" name="Times" /> > <fontData embed="true" name="Arial" /> > </fonts> > <color> > </color> > <template> > <fonts> > <fontData> > <fontData embed="true" > name="Courier">text</fontData> > </fontData> > <fontData embed="true" name="Helvetica" /> > </fonts> > <width> > </width> > </template> > </data> > ============================================================
You can exploit the structure: the Elements you are looking for do not have children, but they do have a "name" attribute. declarations = [ fontData for fontData in root.getiterator('fontData') if fontData.get("name") ] This gives you a list of all "fontData" Elements that declare a font name. The one you want is the last one, i.e. declarations[-1]. You can also do font_names = [ fontData.get("name") for fontData in root.getiterator('fontData') if fontData.get("name") ] or something like that. And if you only want the fontData Elements that appear in the template Elements, try findall instead of getiterator: tree.findall("//template//fontData") ("//" means: descend into the subtree, while "/" would mean: look only at the direct children). > f = root.getiterator('fonts') > n = f[-1].getiterator('fontData') You should not rely on ET returning a list from ".getiterator()", so avoid using f[-1] here. > fntList = [] > f = root.getiterator('fonts') > n = f[-1].find('fontData') > for i in n: > fntList.append(i.get('name')) > > print fntList > ============================================================ > > This code just gave me ['Courier']. Now if I change 'find' to 'findall' then > I'll get [None, 'Helvetica']. Not exactly sure what exactly that's doing. The first value (None) comes from the "fontData" Element that does not have a "name" attibute. The path expression "fontData" means: find all children that are named "fontData". As above, what you want is ".//fontData". Stefan -- http://mail.python.org/mailman/listinfo/python-list