8

i have xml file like

<data>
<person>
    <Name>xyz</Name>   
    <add>abc</add>   
</person>
</data>

i want to add another person node like

<data>
<person>
    <Name>xyz</Name>
    <add>abc</add>
</person>
<person>
    <Name>def</Name>
</person>
</data>

my current python code is

import xml.etree.ElementTree as ET   
from xml.etree.ElementTree import Element    
from xml.etree.ElementTree import ElementTree    

root = ET.parse("Lexicon.xml").getroot()    
creRoot = Element("person")

creDictionary = Element("Name")    
creDictionary.text = "def"    
creRoot.append(creDictionary)    
print(ET.tostring(creRoot))   
creTree= ElementTree(creRoot)   
creTree.write("Lexicon.xml")   

when i run this code it will create xml file rather then add and the result is

<person>
    <Name>def</Name>
</person>

and it will remove all previous data.. Kindly anyone who can solve it.. Thanks in advance

2 Answers 2

5

SubElement shall be used to add nodes to existing node:

import xml.etree.ElementTree as etree

data = etree.XML(input)
person = etree.SubElement(data, 'person')
name = etree.SubElement(person, 'Name')    
name.text = 'def'    
print(etree.tostring(data))
Sign up to request clarification or add additional context in comments.

Comments

1

We need to append new create element to respective parent element.

Demo:

>>> import xml.etree.ElementTree as ET 
>>> input_data = """<data>
... <person>
...     <Name>xyz</Name>   
...     <add>abc</add>   
... </person>
... </data>"""
#- Create new Element. 
>>> person_tag = ET.Element("person")
>>> name_tag = ET.Element("Name") 
#- Add text to Element.
>>> name_tag.text = "def"
#- Append Element to Parent Element.
>>> person_tag.append(name_tag)
>>> 
#- Just print Parent Element
>>> ET.tostring(person_tag)
'<person><Name>def</Name></person>'
>>> 
>>> 
#- Created  ET object by formstring.
>>> root = ET.fromstring(input_data)
>>> 
#- Append above element to root element
>>> root.append(person_tag)
#- Print root Element.
>>> print ET.tostring(root)
<data>
<person>
    <Name>xyz</Name>   
    <add>abc</add>   
</person>
<person><Name>def</Name></person></data>
>>> print ET.tostring(root, method="xml")
<data>
<person>
    <Name>xyz</Name>   
    <add>abc</add>   
</person>
<person><Name>def</Name></person></data>
>>> 

Note: Best to use lxml b

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.