etree Clone Node

后端 未结 5 1228
慢半拍i
慢半拍i 2020-12-30 20:00

How to clone Element objects in Python xml.etree? I\'m trying to procedurally move and copy (then modify their attributes) nodes.

相关标签:
5条回答
  • 2020-12-30 20:14

    If you have a handle on the Element elem's parent you can call

    new_element = SubElement(parent, elem.tag, elem.attrib)
    

    Otherwise you might want to try

    new_element = makeelement(elem.tag, elem.attrib)
    

    but this is not advised.

    0 讨论(0)
  • 2020-12-30 20:26

    For future reference.

    Simplest way to copy a node (or tree) and keep it's children, without having to import ANOTHER library ONLY for that:

    def copy_tree( tree_root ):
        return et.ElementTree( tree_root );
    
    duplicated_node_tree = copy_tree ( node );    # type(duplicated_node_tree) is ElementTree
    duplicated_tree_root_element = new_tree.getroot();  # type(duplicated_tree_root_element) is Element
    
    0 讨论(0)
  • 2020-12-30 20:30

    A different, and somewhat disturbing solution:

    new_element = lxml.etree.fromstring(lxml.etree.tostring(elem))
    
    0 讨论(0)
  • 2020-12-30 20:31

    You can just use copy.deepcopy() to make a copy of the element. (this will also work with lxml by the way).

    0 讨论(0)
  • 2020-12-30 20:37

    At least in Python 2.7 etree Element has a copy method: http://hg.python.org/cpython/file/2.7/Lib/xml/etree/ElementTree.py#l233

    It is a shallow copy, but that is preferable in some cases.

    In my case I am duplicating some SVG Elements and adding a transform. Duplicating children wouldn't serve any purpose since where relevant they already inherit their parent's transform.

    0 讨论(0)
提交回复
热议问题