0

XMLファイルからデータを読み取るPythonスクリプトがあります

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()

ここに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>

今やりたいことは、読んでいる情報をリストに追加することです。次のようになります。

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]]]]]

このようなリストを作成する方法がよくわかりません。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

2

建物リストのない別のバージョン。xml.etree.ElementTree を 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))

OP入力で与えます。

['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']]]
于 2013-02-25T15:01:32.043 に答える
1

各レベルでリストを作成し、読んだ内容を追加するだけです。各レベルの最後で、リストを外部レベルのリストに追加します。

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
于 2013-02-25T14:37:25.433 に答える