0

こんにちは私は使用しているxmlファイルに問題があります。これで、短いxmlファイルでプログラムは正常に動作しますが、何らかの理由でサイズ(1 MBと考えています)に達すると、「IndexError:list index outofrange」が表示されます。

これが私がこれまでに書いているコードです。

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 -------------------------------------^

これは、デモされたコードでリストにインデックスを付けている唯一の場所です。<author>これは、より大きなXMLサンプルでタグが欠落していることを意味します。これを修正するか、ある程度のエラー処理/データ検証を追加する必要があります。

詳細については、コードの詳細を参照してください。連続するコマンドの戻り動作を利用することで、1行で多くのことを実行しています。だから、num定義されている、それは結構です。次に、関数(メソッド)を呼び出します。リストを返します。そのリストから取得しようとすると例外がスローされるため、属性アクセスに到達してに到達することはありません。firstChildこれは、間違いなく、を取得しないことを意味しますnodeValue

エラーチェックは次のようになります。

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

あなたがそれを達成することができる多くの、多くの方法がありますが。

于 2012-08-29T15:18:53.970 に答える