Reputation: 43
I am new with python and I am trying to modify an xml file below:
<component xmlns:xsi="http://www.w3.orgr">
<memoryMaps>
<memoryMap>
<name>name</name>
<description>description</description>
<peripheral>
<name>periph</name>
<description>description</description>
<baseAddress>0x0</baseAddress>
<range>0x8</range>
<width>32</width>
<register>
<name>reg1</name>
<displayName>reg1</displayName>
<addressOffset>0x0</addressOffset>
<size>32</size>
<access>read-write</access>
<reset>
<value>0x00000002</value>
<mask>0xFFFFFFFF</mask>
</reset>
<field>
...................
</field>
<field>
...................
</field>
</register>
<register>
.................
</register>
<register>
..................
</register>
</peripheral>
</memoryMap>
</memoryMaps>
</component>
I can parse the xml file with success,and do some small modifications to remove elements, but now I need to create 2 parents inside:
<registers>
that contain all "register" elements inside "peripheral"<fields>
that contain all "field" elements inside "register"The result should look as follow:
<component xmlns:xsi="http://www.w3.orgr">
<memoryMaps>
<memoryMap>
<name>name</name>
<description>description</description>
<peripheral>
<name>periph</name>
<description>description</description>
<baseAddress>0x0</baseAddress>
<range>0x8</range>
<width>32</width>
<registers>
<register>
<name>reg1</name>
<displayName>reg1</displayName>
<addressOffset>0x0</addressOffset>
<size>32</size>
<access>read-write</access>
<reset>
<value>0x00000002</value>
<mask>0xFFFFFFFF</mask>
</reset>
<fields>
<field>
...................
</field>
<field>
...................
</field>
<fields>
</register>
<register>
.................
</register>
<register>
..................
</register>
</registers>
</peripheral>
</memoryMap>
</memoryMaps>
</component>
Can you advice what function or approach I could follow in this case? Thank you
Upvotes: 1
Views: 52
Reputation: 379
The following code snippet should do the trick. I have made use of the xml.etree.ElementTree module which is provided as part of the Python Standard Library.
import xml.etree.ElementTree as et
def main():
# Assuming the sample xml is in the file 'input.xml'
tree = et.parse('input.xml')
root = tree.getroot()
for register_parent in root.findall('.//register/..'):
registers = et.SubElement(register_parent, 'registers')
for register in register_parent.findall('.//register'):
fields = et.SubElement(register, 'fields')
for field in register.findall('.//field'):
fields.append(field)
register.remove(field)
registers.append(register)
register_parent.remove(register)
# Verify the result
et.dump(root)
if __name__ == '__main__':
main()
Upvotes: 2