Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python , XML AttributeError: 'NodeList' object has no attribute 'firstChild'

Hello I am having trouble with a xml file I am using. Now what happens is whenever i try to get the msg tag i get an error preventing me from accessing the data. Here is the code I am writing so far.

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 ()

Here is part of the xml if it helps.

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

Now when i use xmlMsg = num.getElementsByTagName('msg')[0].toxml() I can get the code to work, I just have to do a lot of replacing and I rather not have to do that. Also I have date working using xmlDate = num.getElementsByTagName('date')[0].firstChild.nodeValue.

Is there something I am missing or doing wrong? Also here is the traceback.

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'
like image 983
Gilbert V Avatar asked Aug 29 '12 18:08

Gilbert V


2 Answers

I was doing the code wrong it seems. Here is how i was able to solve it.

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"  

I never checked if first child had any value or not. That's what I was missing. the other answers helped well but this is how i was able to get it to work. Thank you guys.

like image 44
Gilbert V Avatar answered Oct 08 '22 13:10

Gilbert V


I suggest a different approach. Below is a program that does what you want (I think...). It uses the ElementTree API instead of minidom. This simplifies things quite a bit.

You have posted several related questions concerning parsing of an XML file using minidom. I really think you should look into ElementTree (and for even more advanced stuff, check out ElementTree's "superset", lxml). Both these APIs are much easier to work with than 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()

Output when using your XML sample (you may want to work a bit more on the exact layout):

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 
like image 159
mzjn Avatar answered Oct 08 '22 13:10

mzjn