The goal is to process a xml file which is originally :
<?xml version="1.0" encoding="utf-8"?>
<model name="cluster">
<data>
<datum name="name1" set="no" get="yes" priority="yes" type="integer" description="desc. for name 1"/>
<datum name="name2" set="no" get="yes" priority="yes" type="integer" description="desc. for name 2"/>
<datum name="name3" set="no" get="yes" type="integer" description="desc. for name 3"/>
<datum name="name4" set="no" get="yes" type="integer" description="desc. for name 4"/>
<datum name="name5" set="no" get="yes" priority="yes" type="integer" description="desc. for name 5"/>
<datum name="name6" set="no" get="yes" priority="yes" type="string" description="desc. for name 6"/>
</data>
to check the presence and fill missing priority attributes. For this, I've used elementTree as below :
def validate_file(filename):
tree = ET.parse(filename)
root=tree.getroot()
for x in root.findall('data'):
datum= x.find('datum')
name= datum.get('name')
for name in root.iter('datum'):
priority = name.get('priority')
if not priority :
name.set('priority', 'yes')
tree.write('myfile.xml')
The problem is that elementTree always sort the processed elements so the input file ends with :
<model name="cluster">
<data>
<datum description="desc. for name 1" get="yes" name="name1" priority="yes" set="no" type="integer" />
<datum description="desc. for name 2" get="yes" name="name2" priority="yes" set="no" type="integer" />
<datum description="desc. for name 3" get="yes" name="name3" priority="yes" set="no" type="integer" />
<datum description="desc. for name 4" get="yes" name="name4" priority="yes" set="no" type="integer" />
<datum description="desc. for name 5" get="yes" name="name5" priority="yes" set="no" type="integer" />
<datum description="desc. for name 6" get="yes" name="name6" priority="yes" set="no" type="string" />
</data>
</model>
which is alphabetically ordered where the original file wasn't. Since a similar question have been posted here, I can't believe that to be able to have the same original order, one needs to modify (i.e.: patch) the elementTree source code. Finally, if ElementTree can't do this : is there a workaround to keep the same order as it's easier for humans to read it?