5

こんにちは、使用している xml ファイルに問題があります。これで、msg タグを取得しようとするたびにエラーが発生し、データにアクセスできなくなります。これが私がこれまでに書いているコードです。

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:

    xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue

    content += xmlDate + '\n '

    xmlMsg = num.getElementsByTagName('msg')


    if xmlMsg !='' and len(xmlMsg) > 0:
        xmlMsgc = xmlMsg[0].firstChild.nodeValue
        content += "   Comments: \n        " + str(xmlMsg) + '\n\n'

    else:
        xmlMsgc = "No comment made."

        content += xmlMsgc

  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>

使用するxmlMsg = num.getElementsByTagName('msg')[0].toxml()と、コードを機能させることができます。多くの置換を行う必要があり、むしろそれを行う必要はありません。また、私は日付を使用して作業していxmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValueます。

私が行方不明または間違っていることはありますか? ここにもトレースバックがあります。

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 94, in xml_data
    xmlMsg = num.getElementsByTagName('msg').firstChild.nodeValue
AttributeError: 'NodeList' object has no attribute 'firstChild'
4

4 に答える 4

5

別のアプローチを提案します。以下は、あなたが望むことを行うプログラムです(私は思う...)。minidom の代わりにElementTree APIを使用します。これにより、物事がかなり単純化されます。

minidom を使用した XML ファイルの解析に関するいくつかの関連する質問を投稿しました。ElementTree を調べる必要があると思います (さらに高度な機能については、ElementTree の「スーパーセット」であるlxmlを確認してください)。これらの API は両方とも、minidom よりもはるかに簡単に操作できます。

import xml.etree.ElementTree as ET

def xml_data():
    root = ET.parse("opidea_2.xml")
    logentries = root.findall("logentry")
    content = ""

    for logentry in logentries:
        date = logentry.find("date").text
        content += date + '\n '
        msg = logentry.find("msg")
        if msg is not None:
            content += "   Comments: \n        " + msg.text + '\n\n'
        else:
            content += "No comment made."

    print content

if __name__ == "__main__":
    xml_data()

XML サンプルを使用した場合の出力 (正確なレイアウトについてもう少し作業したい場合があります):

2012-08-06T21:01:52.494219Z
    Comments: 
        PATCH_BRANCH:N/A
 BUG_NUMBER:N/A
 FEATURE_AFFECTED:N/A
 OVERVIEW:N/A
  Adding the SVN log size requirement to the branch 
于 2012-08-31T15:28:22.953 に答える
3

私はコードを間違っていたようです。これが私がそれを解決できた方法です。

if len(xmlMsg) > 0 and xmlMsg[0].firstChild != None:

        xmlMsgc = xmlMsg[0].firstChild.nodeValue

        xmlMsgpbr = xmlMsgc.replace('\n', '       ')  

        xmlMsgf.append(xmlMsgpbr)        

    else:    

        xmlMsgf = "No comments made"  

最初の子に値があるかどうかを確認したことはありません。それが私が見逃していたものです。他の答えはうまくいきましたが、これが私がそれを機能させることができた方法です。君たちありがとう。

于 2012-09-07T15:29:00.910 に答える
2
myNodeList.item( 0)

多分... http://docs.python.org/library/xml.dom.html

于 2012-08-29T18:19:40.373 に答える