Как правильно разобрать XML атрибуты и добавить в список с Python? - PullRequest
0 голосов
/ 14 января 2020

Как правильно проанализировать файл XML (config. xml) с elementtree?

С помощью функции getting_config_from_file() (цель состоит в том, чтобы получить список со всеми субъектами id s, чтобы использовать позже. Но эта функция на самом деле ничего не возвращает. Я также думаю, что по какой-то причине она даже не вводит оператор for. Что я мог бы сделать по-другому?

вот моя функция:

def getting_config_from_file():
    tree = ET.parse('config.xml')
    root = tree.getroot()
    parsed_subjects = []
    for x in root[0]:
        parsed_subjects.append(x.attrib)
    print(parsed_subjects)
    return parsed_subjects

и вот как выглядит мой xml файл

<?xml version="1.0" encoding="UTF-8" ?>
<all_configs>
    <subjects>
        <subject>
            <id>EB101</id>
            <subject_name>Cálculo I</subject_name>
            <classes_no>1</classes_no>
            <pre_reqs></pre_reqs>
        </subject>
        <subject>
            <id>SI100</id>
            <subject_name>Algoritmos e Programação de Computadores I</subject_name>
            <classes_no>2</classes_no>
            <pre_reqs></pre_reqs>
        </subject>
        <subject>
            <id>SI120</id>
            <subject_name>Lógica Matemática</subject_name>
            <classes_no>1</classes_no>
            <pre_reqs></pre_reqs>
        </subject>
        <subject>
            <id>SI201</id>
            <subject_name>Estrutura de Dados I</subject_name>
            <classes_no>2</classes_no>
            <pre_reqs></pre_reqs>
        </subject>
        <subject>
            <id>SI250</id>
            <subject_name>Economia e Finanças</subject_name>
            <classes_no>3</classes_no>
            <pre_reqs>SI100</pre_reqs>
        </subject>
    </subjects>
    <parameters>
        <parameter>
            <parameter_name>Below Average</parameter_name>
            <min_grade>0</min_grade>
            <max_grade>5</max_grade>
        </parameter>
        <parameter>
            <parameter_name>Average</parameter_name>
            <min_grade>5</min_grade>
            <max_grade>7</max_grade>
        </parameter>
        <parameter>
            <parameter_name>Above Average</parameter_name>
            <min_grade>7</min_grade>
            <max_grade>10</max_grade>
        </parameter>
    </parameters>
</all_configs>
</xml>

1 Ответ

1 голос
/ 14 января 2020

Файл xml не должен иметь </xml> в конце и может не анализироваться в результате. Несмотря на это, .attrib будет искать атрибуты элемента. Элемент subject не имеет никакого атрибута, и в результате возвращается пустой список.

Чтобы получить id для каждого subject, нам необходим доступ к первому элементу внутри для l oop. Вот как это может выглядеть:

 def getting_config_from_file():
    tree = ET.parse('config.xml')
    root = tree.getroot()
    parsed_subjects = []
    for x in root[0]: # access each subject
        parsed_subjects.append(x[0].text) # every x is an element. 0 refers to the first element.
    print(parsed_subjects)
    return parsed_subjects

Надеюсь, это поможет.

...