user1209304
user1209304

Reputation: 428

How to make a copy of xml tree in python using ElementTree?

I'm using xml.etree.ElementTree to parse xml file. I'm parsing xml file in the following way:

import xml.etree.ElementTree as ET
tree = ET.parse(options.xmlfile)
root = tree.getroot()

This is my xml file:

<rootElement>
    <member>
        <member_id>439854395435</member_id>
    </member>
</rootElement>

Then I'm saving it:

tree.write(options.outcsvfile)

How can I make a copy of my tree to produce something like this:

<rootElement>
    <member>
        <member_id>439854395435</member_id>
    </member>
    <member>
        <member_id>439854395435</member_id>
    </member>
</rootElement>

Upvotes: 11

Views: 13682

Answers (2)

AJNeufeld
AJNeufeld

Reputation: 8695

Update for Python 3.9

As of Python 3.9, ElementTree has an indent function, which will make the document look a little cleaner. The default is to indent each level with two spaces, but adding the , space=' ' parameter, the original 4-space indentation can be replicated.

import xml.etree.ElementTree as ET
import copy

tree = ET.parse("test.xml")
root = tree.getroot() 

# Find element to copy 
member1 = tree.find("member")

# Create a copy
member2 = copy.deepcopy(member1)

# Append the copy 
root.append(member2)

ET.indent(root, space='    ')          # <-- New

ET.dump(root)

Output:

<rootElement>
    <member>
        <member_id>439854395435</member_id>
    </member>
    <member>
        <member_id>439854395435</member_id>
    </member>
</rootElement>

Upvotes: 1

mzjn
mzjn

Reputation: 50947

You can create a copy of the member element and append it. Example:

import xml.etree.ElementTree as ET
import copy

tree = ET.parse("test.xml")
root = tree.getroot() 

# Find element to copy 
member1 = tree.find("member")

# Create a copy
member2 = copy.deepcopy(member1)

# Append the copy 
root.append(member2)

print ET.tostring(root)

Output:

<rootElement>
    <member>
        <member_id>439854395435</member_id>
    </member>
<member>
        <member_id>439854395435</member_id>
    </member>
</rootElement>

Upvotes: 16

Related Questions