Home > Software engineering >  XML to df, AttributeError: 'NoneType' object has no attribute 'text'
XML to df, AttributeError: 'NoneType' object has no attribute 'text'

Time:01-25

I am converting an xml file to csv. I found I couldn't use .text for elem. It says:

AttributeError: 'NoneType' object has no attribute 'text'

cols = ["fieldDeviceID", "lastUpdateTime", "locStatus", "deviceStatus",
       "owningAgencyID", "locationTimeStamp", "volume", "occupancy", "speed", "detectorizationRatio"]
rows = []

with gzip.open(gz_files[1], 'rb') as f:
    tree = ET.parse(f)
    root = tree.getroot()
    for elem in root.iter():
        fieldDeviceID = elem.find("fieldDeviceID").text
        lastUpdateTime = elem.find("lastUpdateTime").text
        locStatus = elem.find("locStatus").text
        deviceStatus = elem.find("deviceStatus").text
        owningAgencyID = elem.find("owningAgencyID").text
        locationTimeStamp = elem.find("locationTimeStamp").text
        volume = elem.find("volume").text
        occupancy = elem.find("occupancy").text
        speed = elem.find("speed").text
        detectorizationRatio = elem.find("detectorizationRatio").text
  
        rows.append({"fieldDeviceID": fieldDeviceID,
                 "lastUpdateTime": lastUpdateTime, 
                 "locStatus": locStatus, 
                 "deviceStatus": deviceStatus,
                 "owningAgencyID": owningAgencyID, 
                 "locationTimeStamp": locationTimeStamp, 
                 "volume": volume, 
                 "occupancy": occupancy,
                 "speed": speed, 
                 "detectorizationRatio": detectorizationRatio})
    

df = pd.DataFrame(rows, columns=cols)

How can I fix it up?

CodePudding user response:

I solved my own problem. Here is the code.

cols = ["fieldDeviceID", "lastUpdateTime", "locStatus", "deviceStatus",
       "owningAgencyID", "locationTimeStamp", "volume", "occupancy", "speed", "detectorizationRatio"]
rows = []

with gzip.open(gz_files[1], 'rb') as f:
    tree = ET.parse(f)
    root = tree.getroot()
    for elem in root.iter():
        if elem.find("fieldDeviceID") != None:
            fieldDeviceID = elem.find("fieldDeviceID").text
            
        if elem.find("lastUpdateTime") != None:
            lastUpdateTime = elem.find("lastUpdateTime").text
            
        if elem.find("locStatus") != None:
            locStatus = elem.find("locStatus").text
            
        if elem.find("deviceStatus") != None:
            deviceStatus = elem.find("deviceStatus").text
            
        if elem.find("owningAgencyID") != None:
            owningAgencyID = elem.find("owningAgencyID").text
            
        if elem.find("locationTimeStamp") != None:
            locationTimeStamp = elem.find("locationTimeStamp").text
            
        if elem.find("volume") != None:
            volume = elem.find("volume").text
            
        if elem.find("occupancy") != None:
            occupancy = elem.find("occupancy").text
            
        if elem.find("speed") != None:
            speed = elem.find("speed").text
            
        if elem.find("detectorizationRatio") != None:
            detectorizationRatio = elem.find("detectorizationRatio").text
        
  
        rows.append({"fieldDeviceID": fieldDeviceID,
                 "lastUpdateTime": lastUpdateTime, 
                 "locStatus": locStatus, 
                 "deviceStatus": deviceStatus,
                 "owningAgencyID": owningAgencyID, 
                 "locationTimeStamp": locationTimeStamp, 
                 "volume": volume, 
                 "occupancy": occupancy,
                 "speed": speed, 
                 "detectorizationRatio": detectorizationRatio})
    

df = pd.DataFrame(rows, columns=cols)

Probably the code can be more concise.

CodePudding user response:

Here is what I got for the final version.

with gzip.open(file, 'rb') as f:
    tree = ET.parse(f)
    VDSReport = tree.getroot()
    for elem in VDSReport:
        parent = elem.find("parent")
        
        fieldDeviceID = parent.find("fieldDeviceID").text
        lastUpdateTime = parent.find("lastUpdateTime").text
        locStatus = parent.find("locStatus").text
        deviceStatus = parent.find("deviceStatus").text
        owningAgencyID = parent.find("owningAgencyID").text
        locationTimeStamp = parent.find("locationTimeStamp").text
        
        volume = elem.find("volume").text
        occupancy = elem.find("occupancy").text
        speed = elem.find("speed").text
        detectorizationRatio = elem.find("detectorizationRatio").text
        
        rows.append({"fieldDeviceID": fieldDeviceID,
                 "lastUpdateTime": lastUpdateTime, 
                 "locStatus": locStatus, 
                 "deviceStatus": deviceStatus,
                 "owningAgencyID": owningAgencyID, 
                 "locationTimeStamp": locationTimeStamp, 
                 "volume": volume, 
                 "occupancy": occupancy,
                 "speed": speed, 
                 "detectorizationRatio": detectorizationRatio})
  •  Tags:  
  • Related