2017-10-09 68 views
0

XML文件的部分:使用Python xmltodict阅读第三标签

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

用程序( )我会得到一个类型和列表代码标记出来的XML文件。

现在,我试图找出如何让郎标记出来,并做出similair列表像一个以上,但只有代码和郎标签

我做了一个新的变量:

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

当我打印这我得到一个错误

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

谁能说什么我做错了吗?请使用简单易读的Python代码。我是一名学生,开始学习python。

感谢

+0

请你分享一个完整的文件例子吗? –

+1

好吧,我只是改变了它。 –

回答

0

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

很好的解释先生。 –

+1

所以我现在提出: insideName = stations [0] ['Name'] >>> print(insideName ['Lang'] 我得到一个站的正确答案,但是如何打印出所有的字典Namen的值?所以不用把[0]放在那里,因为这是一个特定的站,我一次都需要它们。 –