您好我正在使用的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
答案 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
虽然有许多方法可以实现这一点。