--- C:\Python25\Lib\xml\etree\ElementPath.py Thu Aug 03 08:25:06 2006 +++ E:\python\openrpg dev\OpenRPG\Development\orpg\external\etree\ElementPath.py Mon Aug 03 04:00:38 2009 @@ -113,6 +113,27 @@ return None ## + # Find first matching object. + + def iter_find(self, element): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return None + return nodeset[0] + + found = None + for elem in element: + if elem.tag == tag: + return elem + else: + found = self.iter_find(elem) + if found is not None: + return found + return None + + ## # Find text for first matching object. def findtext(self, element, default=None): @@ -128,6 +149,27 @@ return default ## + # Find text for first matching object. + + def iter_findtext(self, element, default=None): + tag = self.tag + if tag is None: + nodeset = self.findall(element) + if not nodeset: + return default + return nodeset[0].text or "" + + found = None + for elem in element: + if elem.tag == tag: + return elem.text or "" + else: + found = self.iter_findtext(elem) + if found is not None: + return found + return default + + ## # Find all matching objects. def findall(self, element): @@ -139,7 +181,7 @@ index = index + 1 except IndexError: return nodeset - set = [] + new_set = [] if isinstance(path, xpath_descendant_or_self): try: tag = self.path[index] @@ -152,17 +194,17 @@ for node in nodeset: new = list(node.getiterator(tag)) if new and new[0] is node: - set.extend(new[1:]) + new_set.extend(new[1:]) else: - set.extend(new) + new_set.extend(new) else: for node in nodeset: - for node in node: - if path == "*" or node.tag == path: - set.append(node) - if not set: + for n in node: + if path == "*" or n.tag == path: + new_set.append(n) + if not new_set: return [] - nodeset = set + nodeset = new_set _cache = {} @@ -196,3 +238,15 @@ def findall(element, path): return _compile(path).findall(element) + +## +# Find first matching object. + +def iter_find(element, path): + return _compile(path).iter_find(element) + +## +# Find text for first matching object. + +def iter_findtext(element, path, default=None): + return _compile(path).iter_findtext(element, default)