From 4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e Mon Sep 17 00:00:00 2001 From: Jan Pokorný Date: Thu, 19 Jun 2014 19:55:11 +0200 Subject: utils_xml: implement way to 'juggle'/re-{root,parent} XML elems MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jan Pokorný --- utils_xml.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'utils_xml.py') diff --git a/utils_xml.py b/utils_xml.py index 9e27b65..b880348 100644 --- a/utils_xml.py +++ b/utils_xml.py @@ -57,6 +57,41 @@ RNG_ELEMENT = ("/{0}//{1}".format(namespaced('rng', 'grammar'), + "[@name = '{0}']") +class ElementJuggler(object): + """Element juggling, possibly utilizing own temporary holder + + This can be handy e.g. to automatically strip unused namespaces + for `tostring` method, without a need to copy/reparse, followed + by returning the element back. + """ + + _aside_tree = etree.ElementTree(etree.Element('ROOT')) + + def __init__(self, tree=_aside_tree): + self._root = tree.getroot() + + def grab(self, elem): + parent = elem.getparent() + assert parent is not self._root + parent_index = parent.index(elem) + self._root.append(elem) + return parent, parent_index + + @staticmethod + def rebind(elem, parent_pos): + parent, parent_index = parent_pos + parent.insert(parent_index, elem) + return elem + + def drop(self, elem): + parent = elem.getparent() + if parent is not self._root: + raise ValueError + parent.remove(elem) + +element_juggler = ElementJuggler() + + @selfaware def rng_pivot(me, et, tag): """Given Relax NG grammar etree as `et`, change start tag (in situ!) -- cgit