Reputation: 103
I have a python script that reads data from an xml file
import xml.etree.ElementTree as ET
MAX_VALUE = 20
PATH_IN = "sweep.xml"
tree = ET.parse(PATH_IN)
root = tree.getroot()
projects = [""]*MAX_VALUE
designs = [""]*MAX_VALUE
params = [""]*MAX_VALUE
for i, project in enumerate(root):
projects[i] = project
print(project.get('name'))
for u, design in enumerate(project):
designs[u] = design
print(design.get('name'))
for x, param in enumerate(design):
params[x] = param
print(param.get('name'))
for x, info in enumerate(param):
print(info.text)
raw_input()
Here's the xml
<xml>
<project name="testProj">
<design name="des1">
<param name="mag_d">
<value>3mm</value>
<start>1</start>
<stop>5</stop>
<step>1</step>
</param>
<param name="mag_x">
<value>3mm</value>
<start>2</start>
<stop>7</stop>
<step>1</step>
</param>
<param name="mag_y">
<value>3mm</value>
<start>1</start>
<stop>2</stop>
<step>0.1</step>
</param>
</design>
<design name="des2">
<param name="mag_d">
<value>3mm</value>
<start>1</start>
<stop>5</stop>
<step>1</step>
</param>
<param name="mag_x">
<value>3mm</value>
<start>2</start>
<stop>7</stop>
<step>1</step>
</param>
<param name="mag_y">
<value>3mm</value>
<start>1</start>
<stop>2</stop>
<step>0.1</step>
</param>
</design>
</project>
</xml>
What I want to do now is to add the information I'm reading into a list. It should look somthing like this:
Input=[['testProj','des1',[['mag_d',[1,2,3]],['mag_x',[2,3,4]]]], ['testProj','des2'[['mag_d',[1,2,3]],['mag_x',[2,3,4]]]]]
I don't really know how to create a list like that. Can someone point me in the right direction?
Upvotes: 0
Views: 202
Reputation: 4903
Another version w/o building lists. import xml.etree.ElementTree as ET
PATH_IN = "sweep.xml"
tree = ET.parse(PATH_IN)
def convert(root):
for p in root.iter('project'):
yield p.get('name')
for d in p.iter('design'):
yield d.get('name')
for e in d.iter('param'):
yield [e.attrib['name'], [p.text for p in e]]
it = convert(tree.getroot())
import pprint
pprint.pprint(list(it))
On OP input gives.
['testProj',
'des1',
['mag_d', ['3mm', '1', '5', '1']],
['mag_x', ['3mm', '2', '7', '1']],
['mag_y', ['3mm', '1', '2', '0.1']],
'des2',
['mag_d', ['3mm', '1', '5', '1']],
['mag_x', ['3mm', '2', '7', '1']],
['mag_y', ['3mm', '1', '2', '0.1']]]
Upvotes: 2
Reputation: 6767
Just create a list at each level and append what you read into it. At the end of each level, append the list to the outer-level list.
lst_lvl1 = [] # Top level list
for i, project in enumerate(root):
projects[i] = project
print(project.get('name'))
lst_lvl1.append(project.get('name')) # Append to the top level list
lst_lvl2 = [] # Create an empty 2nd level list
for u, design in enumerate(project):
designs[u] = design
print(design.get('name'))
lst_lvl2.append(design.get('name')) # Append to the 2nd level list
lst_lvl3 = [] # Create a 3rd level list...
for x, param in enumerate(design):
params[x] = param
print(param.get('name'))
lst_lvl3.append(param.get('name'))
lst_lvl4 = []
for x, info in enumerate(param):
print(info.text)
lst_lvl4.append(info.text)
lst_lvl3.append(lst_lvl4) # At the end of level 4, append what you got to the level-3 list
lst_lvl2.append(lst_lvl3) # At the end of level 3, append what you got to the level-2 list... etc
lst_lvl1.append(lst_lvl2)
print lst_lvl1
Upvotes: 1