Python читает третий тег с помощью xmltodict

Часть файла XML:

<?xml version="1.0" encoding="UTF-8"?>

<Station>
    <Code>HT</Code>
    <Type>knooppuntIntercitystation</Type>
    <Namen>
        <Kort>Den Bosch</Kort>
        <Middel>'s-Hertogenbosch</Middel>
        <Lang>'s-Hertogenbosch</Lang>
    </Namen>
    <Land>NL</Land>
    <Synoniemen>
        <Synoniem>Hertogenbosch ('s)</Synoniem>
        <Synoniem>Den Bosch</Synoniem>
    </Synoniemen>
</Station>


<Station>
    <Code>ALMO</Code>
    <Type>stoptreinstation</Type>
    <Namen>
        <Kort>Oostvaard</Kort>
        <Middel>Oostvaarders</Middel>
        <Lang>Almere Oostvaarders</Lang>
    </Namen>
    <Land>NL</Land>
    <Synoniemen></Synoniemen>
</Station>

<Station>
    <Code>ATN</Code>
    <Type>stoptreinstation</Type>
    <Namen>
        <Kort>Aalten</Kort>
        <Middel>Aalten</Middel>
        <Lang>Aalten</Lang>
    </Namen>
    <Land>NL</Land>
    <Synoniemen></Synoniemen>
</Station>

<Station>
    <Code>ASA</Code>
    <Type>intercitystation</Type>
    <Namen>
        <Kort>Amstel</Kort>
        <Middel>Amsterdam Amstel</Middel>
        <Lang>Amsterdam Amstel</Lang>
    </Namen>
    <Land>NL</Land>
    <Synoniemen></Synoniemen>
</Station>

Мой код на Python для чтения xmlfile:

import xmltodict

def leesXML(filename):
    with open(filename) as mijnXMLBestand:
        inhoud = mijnXMLBestand.read()
        xmldictionary = xmltodict.parse(inhoud)
        return xmldictionary

stationsdictionary = leesXML('stations.xml')
stations = stationsdictionary['Stations']['Station']

def program():
    for station in stations:
        type = station['Type']
        Code = station['Code']
        print(Code + '      -       ' + type)
print('Dit zijn de codes en types van de 4 stations:')
program()

С помощью Program() я получу список с тегом type и code из xml-файла.

Сейчас я пытаюсь выяснить, как извлечь из него тег lang и составить список, похожий на приведенный выше, но только с тегами Code и Lang.

Я сделал новую переменную:

thirdtag = stationsdictionary['Stations']['Station']['Namen']

когда я печатаю это, я получаю сообщение об ошибке

TypeError: list indices must be integers or slices, not str

Кто-нибудь может сказать, что я делаю не так? Пожалуйста, используйте простой и читаемый код Python. Я студент начал изучать питон.

Спасибо

1 ответ

stations объект является list пример:

>>>stations.__class__ 
<class 'list'>

Следовательно, вы должны получить доступ к элементам, дающим list целочисленный индекс (или фрагменты, но здесь не применяется), например так:

>>>stations[0]
OrderedDict([('Code', 'HT'), ('Type', 'knooppuntIntercitystation'), ('Namen', OrderedDict([('Kort', 'Den Bosch'), ('Middel', "'s-Hertogenbosch"), ('Lang', "'s-Hertogenbosch")])), ('Land', 'NL'), ('Synoniemen', OrderedDict([('Synoniem', ["Hertogenbosch ('s)", 'Den Bosch'])]))])

Этот последний объект является Dict экземпляр (более конкретно, OrderedDict), так что вы ищете это:

>>> stations[0]['Namen']
OrderedDict([('Kort', 'Den Bosch'), ('Middel', "'s-Hertogenbosch"), ('Lang', "'s-Hertogenbosch")])

Изменить: Чтобы ответить на ваш последний вопрос в комментариях, вы можете сделать следующее:

>>>station_names = []
>>>for station in stations:
>>>     station_names.append(station['Namen'])
>>>#or by comprehension
>>>station_names = [station['Namen'] for station in stations]

В любом случае вы получите:

>>> station_names
[OrderedDict([('Kort', 'Den Bosch'), ('Middel', "'s-Hertogenbosch"), ('Lang', "'s-Hertogenbosch")]), OrderedDict([('Kort', 'Oostvaard'), ('Middel', 'Oostvaarders'), ('Lang', 'Almere Oostvaarders')])]
Другие вопросы по тегам