0

您好,我正在使用的 xml 文件遇到问题。现在发生的事情是在一个简短的 xml 文件上,该程序可以正常工作,但是由于某种原因,一旦它达到一定大小(我认为是 1 MB),它就会给我一个“IndexError:list index out of range”

这是我目前正在编写的代码。

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
4

1 回答 1

1

根据提供的代码,您的错误将出现在这一行:

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

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

请参阅代码详细说明以获取更多说明。通过利用连续命令的返回行为,您可以在一行中做很多事情。所以,num定义了,没关系。然后你调用一个函数(方法)。它返回一个列表。您尝试从该列表中检索并引发异常,因此您永远不会进入属性访问以获得 to firstChild,这绝对意味着您没有获得nodeValue

错误检查可能如下所示:

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

尽管有很多很多方法可以实现这一目标。

于 2012-08-29T15:18:53.970 回答