Yui
Yui

Reputation: 103

read data form xml to list

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

Answers (2)

sotapme
sotapme

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

Dhara
Dhara

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

Related Questions