create a tag at top of xml file using python

Question:

I have xml file named ‘test.xml’ like below format

<final_output>
    <career_profile>
        <output>
            <Template OriginalSentence="1" SentenceID="1" RecordID="0">
                <Employer Type="String"><Value>HCL TECHNOLOGY LTD</Value></Employer>
                <duration><Value>JAN 2018 to till date</Value></duration>
            </Template>
        </output>
    </career_profile>
</final_output>

I want to add a final_file tag on top of test.xml file using python.

The output should look like:

<final_file>
    <final_output>
        <career_profile>
            <output>
                <Template OriginalSentence="1" SentenceID="1" RecordID="0">
                    <Employer Type="String"><Value>HCL TECHNOLOGY LTD</Value></Employer>
                    <duration><Value>JAN 2018 to till date</Value></duration>
                </Template>
            </output>
        </career_profile>
    </final_output>
</final_file>

For this I have used additional xml file named ‘random.xml’ file containing <final_file> </final_file> .

random.xml looks like:

<final_file>

</final_file>

I am not getting the <final_output> </final_output> tag in the resultant output.xml.

I have tried the following code:

import xml.etree.ElementTree as ET

xmlfile1 = "random.xml"
xmlfile2 = "test.xml"

tree1 = ET.parse(xmlfile1)
tree2 = ET.parse(xmlfile2)

root1 = tree1.getroot()
root2 = tree2.getroot()

root1.extend(root2)

tree1.write('output.xml')

But I am getting like:

<final_file>
   
        <career_profile>
            <output>
                <Template OriginalSentence="1" SentenceID="1" RecordID="0">
                    <Employer Type="String"><Value>HCL TECHNOLOGY LTD</Value></Employer>
                    <duration><Value>JAN 2018 to till date</Value></duration>
                </Template>
            </output>
        </career_profile>
    
</final_file>

I have tried with

random.xml:

<final_file>
    <final_output>

    </final_output>
</final_file>

But I am getting like this:

<final_file>
   <final_output>    </final_output>

       <career_profile>
            <output>
                <Template OriginalSentence="1" SentenceID="1" RecordID="0">
                    <Employer Type="String"><Value>HCL TECHNOLOGY LTD</Value></Employer>
                    <duration><Value>JAN 2018 to till date</Value></duration>
                </Template>
            </output>
        </career_profile>

</final_file>

Is there a way to do this without additional random.xml file.

The thing I am expecting is that to existing .xml file <finalfile*> tag is to be inserted at top and </*final_file> tag at bottom of the file.

Asked By: venu

||

Answers:

If you want to use xml package then the simple solution will be

from xml.etree import ElementTree

xml_input = "input.xml"
xml_output = "output.xml"

tree_input = ElementTree.parse(xml_input)
root = tree_input.getroot()

# add new tag
new_root = ElementTree.Element("final_file")
new_root.insert(0, root)

# format XML
ElementTree.indent(new_root)

print(ElementTree.dump(new_root))

with open(xml_output, "wb") as xml_file:
    xml_file.write(ElementTree.tostring(new_root))

in this case, the output will be

<final_file>
  <final_output>
    <career_profile>
      <output>
        <Template OriginalSentence="1" SentenceID="1" RecordID="0">
          <Employer Type="String">
            <Value>HCL TECHNOLOGY LTD</Value>
          </Employer>
          <duration>
            <Value>JAN 2018 to till date</Value>
          </duration>
        </Template>
      </output>
    </career_profile>
  </final_output>
</final_file>
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.