Mercurial > libervia-backend
diff sat/tools/xml_tools.py @ 4010:818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 16 Mar 2023 16:43:08 +0100 |
parents | f461f11ea176 |
children | bb211f80c3e6 |
line wrap: on
line diff
--- a/sat/tools/xml_tools.py Thu Mar 16 15:56:11 2023 +0100 +++ b/sat/tools/xml_tools.py Thu Mar 16 16:43:08 2023 +0100 @@ -20,7 +20,7 @@ from collections import OrderedDict import html.entities import re -from typing import Dict, Optional, Tuple, Union, Literal, overload +from typing import Dict, Optional, Tuple, Union, Literal, overload, Iterable from xml.dom import NotFoundErr, minidom import xml.etree.ElementTree as ET from lxml import etree @@ -1926,15 +1926,32 @@ yield found -def findAncestor(elt, name: str, namespace: Optional[str] = None) -> domish.Element: - """Retrieve ancestor of an element""" +def findAncestor( + elt, + name: str, + namespace: Optional[Union[str, Iterable[str]]] = None + ) -> domish.Element: + """Retrieve ancestor of an element + + @param elt: starting element, its parent will be checked recursively until the + required one if found + @param name: name of the element to find + @param namespace: namespace of the element to find + - None to find any element with that name + - a simple string to find the namespace + - several namespaces can be specified in an iterable, if an element with any of + this namespace and given name is found, it will match + + """ + if isinstance(namespace, str): + namespace = [namespace] current = elt.parent while True: if current is None: raise exceptions.NotFound( f"Can't find any ancestor {name!r} (xmlns: {namespace!r})" ) - if current.name == name and (namespace is None or current.uri == namespace): + if current.name == name and (namespace is None or current.uri in namespace): return current current = current.parent