# $Id$ # element cloning demo import cElementTree as ET # import elementtree.ElementTree as ET ## # Turns an element tree into a cloning factory. The callable object # returned by this function returns copies of the original tree. # # @param elem An element tree. # @return A callable factory object. def make_factory(elem): def generate_elem(append, elem, level): var = "e" + str(level) arg = repr(elem.tag) if elem.attrib: arg += ", **%r" % elem.attrib if level == 1: append(" e1 = Element(%s)" % arg) else: append(" %s = SubElement(e%d, %s)" % (var, level-1, arg)) if elem.text: append(" %s.text = %r" % (var, elem.text)) if elem.tail: append(" %s.tail = %r" % (var, elem.tail)) for e in elem: generate_elem(append, e, level+1) # generate code for a function that creates a tree output = ["def element_factory():"] generate_elem(output.append, elem, 1) output.append(" return e1") # setup global function namespace namespace = {"Element": ET.Element, "SubElement": ET.SubElement} # create function object exec "\n".join(output) in namespace return namespace["element_factory"] # -------------------------------------------------------------------- # demo code import copy DOC1 = "
text