Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Modify a XML using ElementTree

<grandParent>
    <parent>
       <child>Sam/Astronaut</child>
    </parent>
</grandParent>

I want to modify the above XML by adding another child tag inside parent tag. I'm doing something like this..

tree = ET.parse("test.xml")
a=ET.Element('parent')
b=ET.SubElement(a,"child")
b.text="Jay/Doctor"
tree.write("test.xml")

Is this the correct way of modifying the xml file? Any better way? or what else should I be taking care of in the above code?

like image 927
nick01 Avatar asked Jul 31 '14 20:07

nick01


1 Answers

Your code creates a whole new tree and adds Jay to it. You need to connect Jay to the existing tree, not to a new one.

Try this:

import xml.etree.ElementTree as ET

tree = ET.parse("test.xml")
a = tree.find('parent')          # Get parent node from EXISTING tree
b = ET.SubElement(a,"child")
b.text = "Jay/Doctor"
tree.write("test.xml")

If you want to search for a particular child, you could do this:

import xml.etree.ElementTree as ET
tree = ET.parse("test.xml")
a = tree.find('parent')
for b in a.findall('child'):
    if b.text.strip() == 'Jay/Doctor':
        break
else:
    ET.SubElement(a,"child").text="Jay/Doctor"
tree.write("test.xml")

Notice a.findall() (similar to a.find(), but returns all of the named elements). xml.etree has very limited search criteria. You might consider using lxml.etree and its .xpath() method.

like image 136
Robᵩ Avatar answered Oct 05 '22 11:10

Robᵩ