summaryrefslogtreecommitdiffstats
path: root/utils_xml.py
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2014-06-19 19:55:11 +0200
committerJan Pokorný <jpokorny@redhat.com>2014-06-19 19:55:11 +0200
commit4a3a6184440ef5ae6d00d5aa4b2a56c8c452691e (patch)
tree7a0f122c656386bd2a0efe5314a84037f7026393 /utils_xml.py
parent80344b12b4eeca50c8e5cbf6c4e84adedca15450 (diff)
downloadclufter-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.py35
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!)