Home > Back-end >  How to insert elements into a nested XML using Python?
How to insert elements into a nested XML using Python?

Time:07-28

I have an XML in the following form

<PROJECT>
    <UPDATE_TYPE>FULL</UPDATE_TYPE>
    <PROJECT_NAME>GEN20x_BALBOA</PROJECT_NAME>
    <AAA>000</AAA>
    <BBB>CIVIC</BBB>
    <CCC>ECE</CCC>
    <BLOCK>
        <BLOCK1>
            <TYPE>BOOT</TYPE>
            <TYPE>BOOT</TYPE>
            <TASK>
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="qqq" />
            </TASK>
        </BLOCK1>
    </BLOCK>
</PROJECT>

I need to insert another <INSTALL_OPTIONS> inside TASK tag, the result thus should look like this

<PROJECT>
    <UPDATE_TYPE>FULL</UPDATE_TYPE>
    <PROJECT_NAME>GEN20x_BALBOA</PROJECT_NAME>
    <AAA>000</AAA>
    <BBB>CIVIC</BBB>
    <CCC>ECE</CCC>
    <BLOCK>
        <BLOCK1>
            <TYPE>BOOT</TYPE>
            <TYPE>BOOT</TYPE>
            <TASK>
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="qqq" />

                <INSTALL_OPTIONS softwareType="new"/>
            </TASK>
        </BLOCK1>
    </BLOCK>
</PROJECT>

I have tried 'insert' operation but coudn't access the nested parts of XML

new = et.Element("INSTALL_OPTIONS")
new.attrib = {softwareType:"new"}
root.insert(5,new)

But the nested insertion didn't happen. How to insert element inside the nested list?

CodePudding user response:

Something like the below

import xml.etree.ElementTree as ET

xml = '''<PROJECT>
    <UPDATE_TYPE>FULL</UPDATE_TYPE>
    <PROJECT_NAME>GEN20x_BALBOA</PROJECT_NAME>
    <AAA>000</AAA>
    <BBB>CIVIC</BBB>
    <CCC>ECE</CCC>
    <BLOCK>
        <BLOCK1>
            <TYPE>BOOT</TYPE>
            <TYPE>BOOT</TYPE>
            <TASK>
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="aaa" />
                <INSTALL_OPTIONS softwareType="qqq" />
            </TASK>
        </BLOCK1>
    </BLOCK>
</PROJECT>'''

root = ET.fromstring(xml)
task = root.find('.//TASK')
io = ET.SubElement(task, 'INSTALL_OPTIONS')
io.attrib['softwareType'] = 'new'
for io in task:
    print(io.attrib)

output

{'softwareType': 'aaa'}
{'softwareType': 'aaa'}
{'softwareType': 'qqq'}
{'softwareType': 'new'}
  • Related