2012-08-29 40 views
0

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

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

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

完整的追溯在哪里?你拿pdb了吗? –

+0

可悲的是我不知道完全追溯是在哪里或者它是什么,也不知道pdb的含义。 –

+1

当您遇到错误时,您不仅仅会得到“索引超出范围”,您将获得为整个执行堆栈打印的行号和调用站点。这被称为“追溯”。包括所有这些。 (你甚至不会说什么行号会产生错误。) –

回答

1

基础上提供的代码你的错误将是在这一行:

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

这是在证明代码的唯一的地方,你索引列入清单。这意味着在你的较大的XML Sample中你缺少一个<author>标签。你必须纠正这个错误,或者添加一些错误处理/数据验证级别。

请参阅代码阐述以获取更多解释。通过利用连续命令的返回行为,你可以在单行中完成大量的事情。所以,定义了num,没关系。然后你调用一个函数(方法)。它返回一个列表。您尝试从该列表中检索并引发异常,因此您绝不会将其设置为属性访问权限以访问firstChild,这肯定意味着您无法获得nodeValue

错误检查可以是这个样子:

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

虽然有,你可以实现很多,方法很多。

+0

所以我将不得不使用某种方式来检查它我认为if语句会有所帮助,但是你说我必须使用别的东西吗? –

+1

'num.getElementsByTagName('author')== []','[] [0]'是'IndexError'。所以不,如果陈述太迟。尝试'authors = num.getElementsByTagName('author');如果作者:author = authors [0] .firstChild.nodeValue'。另外,请考虑使用'xml.etree'。 –

+0

我看到谢谢,所以我可以检查它的长度,如果它大于0,它会打印出来,而不是直接从头开始。谢谢。 –