11

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>
0

2 Answers 2

16

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>
Sign up to request clarification or add additional context in comments.

Comments

1

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>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.