Python,XML索引错误

时间:2012-08-29 15:11:42

标签: python xml xml-parsing

您好我正在使用的xml文件出现问题。现在发生的是在一个简短的xml文件上,该程序工作正常,但由于某种原因,一旦它达到一个大小(我想1 MB) 它给了我一个“IndexError:列表索引超出范围”

这是我到目前为止编写的代码。

from xml.dom import minidom

import smtplib
from email.mime.text import MIMEText
from datetime import datetime

def xml_data():
    f = open('C:\opidea_2.xml', 'r')
    data = f.read()
    f.close()

    dom = minidom.parseString(data)
    ic = (dom.getElementsByTagName('logentry'))
    dom = None      
    content = ''  

    for num in ic:
        name = num.getElementsByTagName('author')[0].firstChild.nodeValue
        if name:
            content += "***Changes by:"  + str(name) + "*** " +  '\n\n     Date: '
        else:
            content += "***Changes are made Anonymously *** " +  '\n\n     Date: '
        print content

if __name__ == "__main__":
    xml_data ()

如果有帮助,这是xml的一部分。

 <log>
 <logentry
  revision="33185">
 <author>glv</author>
 <date>2012-08-06T21:01:52.494219Z</date>
 <paths>

 <path
  kind="file"
  action="M">/branches/Patch_4_2_0_Branch/text.xml</path>   

 <path
  kind="dir"
  action="M">/branches/Patch_4_2_0_Branch</path>

</paths>
<msg>PATCH_BRANCH:N/A
 BUG_NUMBER:N/A
 FEATURE_AFFECTED:N/A
 OVERVIEW:N/A
  Adding the SVN log size requirement to the branch 
 </msg>
  </logentry>
    </log>

实际的xml文件要大得多,但这是一般格式。如果它很小,它实际上会起作用,但一旦它变大,我就会遇到问题。

这里是追溯

Traceback (most recent call last):
  File "C:\python\src\SVN_Email_copy.py", line 141, in <module>
    xml_data ()
  File "C:\python\src\SVN_Email_copy.py", line 50, in xml_data
    name = num.getElementsByTagName('author')[0].firstChild.nodeValue
IndexError: list index out of range

1 个答案:

答案 0 :(得分:1)

根据提供的代码,您的错误将在此行中:

name = num.getElementsByTagName('author')[0].firstChild.nodeValue
#xml node-^
#function call -------------------------^
#list indexing ----------------------------^
#attribute access -------------------------------------^

这是您在列表中编入索引的演示代码中唯一的位置。这意味着在较大的XML示例中,您缺少<author>标记。您必须更正它,或添加某种级别的错误处理/数据验证。

有关详细说明,请参阅代码详细说明。通过利用连续命令的返回行为,您可以在一行中完成大量工作。所以,定义了num,没关系。然后你调用一个函数(方法)。它返回一个列表。您尝试从该列表中检索并引发异常,因此您永远不会将其转到属性访问权限以转到firstChild,这肯定意味着您没有nodeValue

错误检查可能如下所示:

authors = num.getElementsByTagName('author')
if len(authors) > 0:
  name = authors[0].firstChild.nodeValue

虽然有许多方法可以实现这一点。