pythonpython-3.xxmlxml-parsingxml.etree

How to modify xml to insert elements in Python?


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>
                <VERSION>0.1</VERSION>
                <FILE>           
                     <INSTALL_METHOD INSTALL="first" />
                     <INSTALL_OPTIONS softwareType="aaa" />
                     <INSTALL_OPTIONS softwareType="qqq" />
               <FILE> 
            </TASK>
            <TASK>
                <VERSION>0.1</VERSION>
                <FILE>
                    <INSTALL_METHOD INSTALL="second" />
                    <INSTALL_OPTIONS softwareType="aaa" />
                    <INSTALL_OPTIONS softwareType="qqq" />
                    
                </FILE>
            </TASK>
            <TASK>
                 <VERSION>0.1</VERSION>
                 <FILE>
                   <INSTALL_METHOD INSTALL="third" />
                   <INSTALL_OPTIONS softwareType="aaa" />
                   <INSTALL_OPTIONS softwareType="qqq" />
                   
                 </FILE>
            </TASK>
        </BLOCK1>
    </BLOCK>
</PROJECT>

I need to insert another <INSTALL_OPTIONS> inside all the TASK tags apart from the first one, 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>
                <VERSION>0.1</VERSION>
                <FILE>           
                     <INSTALL_METHOD INSTALL="first" />
                     <INSTALL_OPTIONS softwareType="aaa" />
                     <INSTALL_OPTIONS softwareType="qqq" />
               <FILE> 
            </TASK>
            <TASK>
                <VERSION>0.1</VERSION>
                <FILE>
                    <INSTALL_METHOD INSTALL="second" />
                    <INSTALL_OPTIONS softwareType="aaa" />
                    <INSTALL_OPTIONS softwareType="qqq" />
                    <INSTALL_OPTIONS softwareType="new" />
                </FILE>
            </TASK>
            <TASK>
                 <VERSION>0.1</VERSION>
                 <FILE>
                   <INSTALL_METHOD INSTALL="third" />
                   <INSTALL_OPTIONS softwareType="aaa" />
                   <INSTALL_OPTIONS softwareType="qqq" />
                   <INSTALL_OPTIONS softwareType="new" />
                 </FILE>
            </TASK>
        </BLOCK1>
    </BLOCK>
</PROJECT>

Could someone please help me with this?

I tried the following way but coudn't skip the first tag

tasks = root.findall('.//BLOCK/BLOCK1/TASK')
new_io= ET.fromstring('<INSTALL_OPTIONS softwareType="new"/>')
for task in tasks:
    task.insert(3,new_io)

Solution

  • tasks is a list with three items. You are only interested in the last two. You can get a list with only those items by creating a slice as follows:

    tasks = root.findall('.//BLOCK/BLOCK1/TASK')[1:]