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