diff options
author | Jan Pokorný <jpokorny@redhat.com> | 2014-06-19 19:55:11 +0200 |
---|---|---|
committer | Jan Pokorný <jpokorny@redhat.com> | 2014-06-19 19:55:11 +0200 |
commit | 4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e (patch) | |
tree | 7a0f122c656386bd2a0efe5314a84037f7026393 /utils_xml.py | |
parent | 80344b12b4eeca50c8e5cbf6c4e84adedca15450 (diff) | |
download | clufter-4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e.tar.gz clufter-4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e.tar.xz clufter-4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e.zip |
utils_xml: implement way to 'juggle'/re-{root,parent} XML elems
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
Diffstat (limited to 'utils_xml.py')
-rw-r--r-- | utils_xml.py | 35 |
1 files changed, 35 insertions, 0 deletions
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!) |