【问题标题】:What's producing this KeyError while parsing this xml file?解析此 xml 文件时产生此 KeyError 的原因是什么?
【发布时间】:2019-04-01 20:51:34
【问题描述】:

我有一个要解析的 xml 文件。这是一个示例

</Event>


-<Event timestamp="2016-08-14T14:23:33.634" id="1713385925" 
version="1471181110290" last_modified="2016-08-14T14:25:11" y="11.0" 
x="89.7" outcome="0" team_id="148" player_id="51327" sec="8" min="23" 
period_id="1" type_id="4" event_id="205">

<Q id="733814222" qualifier_id="265"/>

<Q id="481660420" qualifier_id="286"/>

<Q id="813378778" qualifier_id="152"/>

<Q id="570443899" qualifier_id="56" value="Right"/>

<Q id="420312891" qualifier_id="233" value="248"/>

<Q id="1186861264" qualifier_id="13"/>

</Event>


-<Event timestamp="2016-08-14T14:23:33.634" id="1635888622" 
version="1471181110289" last_modified="2016-08-14T14:25:11" y="89.0" 
x="10.3" outcome="1" team_id="143" player_id="169007" sec="8" min="23" 
period_id="1" type_id="4" event_id="248">

<Q id="1871787686" qualifier_id="56" value="Back"/>

<Q id="176295814" qualifier_id="13"/>

<Q id="69346842" qualifier_id="233" value="205"/>

<Q id="1588029344" qualifier_id="265"/>

<Q id="559785299" qualifier_id="285"/>

<Q id="380723313" qualifier_id="152"/>

到处都是这样的事件。我可以访问所有其他属性(outcometype_id 等)和子标签,但对于 player_id 的属性值不能这样做。 错误是 - 这是我用来解析它的 xmldom 代码示例。

xml = xmldoc.getElementsByTagName("Games")[0]
Events = xml.getElementsByTagName("Event")

for event in Events:
    typeid = event.attributes["type_id"]
    typeidval = typeid.value

    player = event.attributes["player_id"]
    playeridval = player.value

    teamid = event.attributes["team_id"]
    teamidval = teamid.value

    outcomeid = event.attributes["outcome"]
    outcomeidval = outcomeid.value

有人可以帮助我使用 xmldom/minidom 代码来解决这个问题吗?我到底做错了什么?

【问题讨论】:

  • 显然,并非所有事件标签都有player_id 属性。
  • 啊,确实可能是这样。我该如何解决这个问题? @MartijnPieters
  • 使用ElementTree 代替minidom,后者具有更现代的界面。

标签: python xml python-3.x minidom


【解决方案1】:

一个丑陋的解决方法是处理player_id 属性的异常,并在抛出异常时将值设置为""

try:
    player = event.attributes["player_id"]
    playeridval = player.value
except:
    playeridval = ""

【讨论】:

  • 为什么会很难看?看起来理论上可以解决@glhr
【解决方案2】:

更简洁的方法:

player = event.attributes.get("player_id",None)
playeridval = player.value if player else ""

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2012-07-01
    • 2011-01-20
    • 1970-01-01
    • 2017-02-20
    相关资源
    最近更新 更多