python,索引错误

时间:2009-01-14 17:01:45

标签: python xml for-loop

我有一些代码从xml文件中提取数据,但它似乎随机开始抛出;

Traceback (most recent call last):
  File "C:\Users\mike\Documents\python\arl xml\turn 24 reader", line 52, in <module>
    unitCount   = getText(evoNode.getElementsByTagName("count")[0].childNodes)
IndexError: list index out of range

在我运行它的前几次没问题,如果我偶然改变它,我不知道,但现在它正在抛出错误。

这是它试图使用的xml部分的一个例子;

- <unit>
  <count>1200</count> 
  <type>Zweihander Doppelsoldners</type> 
  <typeid>102</typeid> 
  </unit>

这是它抱怨的代码;

   for unitNode in node.getElementsByTagName('unit'):
      unitName      = getText(evoNode.getElementsByTagName("type")[0].childNodes)
      unitId     = getText(evoNode.getElementsByTagName("typeid")[0].childNodes)
      unitCount   = getText(evoNode.getElementsByTagName("count")[0].childNodes)

      unitList.append("%s x %s" % (unitName, unitCount))

虽然我接受它首先抱怨计数行,因为count是单位部分中xml文件中三个中最高的,但我仍然不确定它为什么抱怨,因为它成功地运行了一组非常相似的从中克隆和编辑的代码。

任何人都知道我能做什么或者可以建议改进问题的方法吗?

2 个答案:

答案 0 :(得分:2)

一个简单的想法:检查evoNode.getElementsByTagName("count")是否返回非空列表:

counts = evoNode.getElementsByTagName("count")
if counts:
    unitCount = getText(counts[0].childNodes)

当然,检查应该应用于您的代码检索到的所有列表。

另外一件事,你使用 unitNode 进行迭代,但在循环内部,您可以访问 evoNode ,这可能与每个人相同迭代。

答案 1 :(得分:1)

正如gimel所说,如果它返回非空列表,你应该检查getElementsByTagName(“count”),但是回到你的问题:

如果你之前说过它正常工作,那么我猜测问题出在你获取XML的源头。