【问题标题】:Python reading third tag using xmltodictPython 使用 xmltodict 读取第三个标签
【发布时间】:2018-03-20 22:39:34
【问题描述】:

部分 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(),我将从 xml 文件中得到一个包含类型和代码标记的列表。

我现在正在尝试弄清楚如何从中取出 lang 标签并制作一个与上面类似但只有 Code 和 Lang 标签的列表

我创建了一个新变量:

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

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

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

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

谢谢

【问题讨论】:

  • 能否分享一个完整的文件示例?
  • 好的,我刚改了。

标签: python xml xmltodict


【解决方案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")])

编辑:为了回答您在 cmets 中的最后一个问题,您可以执行以下操作:

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

【讨论】:

  • 很好的解释先生。
  • 所以我现在做了这个: insideName = station[0]['Name'] >>> print(insideName['Lang'] 我得到了一个站的正确答案,但是我如何打印出字典 Namen 的所有值?所以不要放 [0],因为那是一个特定的站。我一次需要它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多