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