I have this XML from a SOAP call:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header/> <soapenv:Body> <SessionID xmlns="http://www.gggg.com/oog">5555555</SessionID> <QueryResult xmlns="http://www.gggg.com/oog/Query" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Code>testsk</Code> <Records> <Record> <dim_id>1</dim_id> <resource_full_name>Administrator, Sir</resource_full_name> <resource_first_name>Sir</resource_first_name> <resource_last_name>Administrator</resource_last_name> <resource_email>[email protected]</resource_email> <resource_user_name>admin</resource_user_name> </Record> <Record> <dim_id>2</dim_id> <resource_full_name>scheduler, scheduler</resource_full_name> <resource_first_name>scheduler</resource_first_name> <resource_last_name>scheduler</resource_last_name> <resource_email>[email protected]</resource_email> <resource_user_name>scheduler</resource_user_name> </Record>
My goal: To parse each Record's sub-elements <dim_id> ... <resource_user_name> and save each record as a row in a CSV.
My Code:
dim_id_list = [] full_name_list = [] first_name_list = [] last_name_list = [] resource_email_list = [] resource_user_name_list = [] root = et.parse('xml_stuff.xml').getroot() for dim_id in root.iter('{http://www.gggg.com/oog/Query}dim_id'): dim_id_list.append(dim_id.text) for resource_full_name in root.iter('{http://www.gggg.com/oog/Query}resource_full_name'): full_name_list.append(resource_full_name.text) for resource_first_name in root.iter('{http://www.gggg.com/oog/Query}resource_first_name'): first_name_list.append(resource_first_name.text) for resource_last_name in root.iter('{http://www.gggg.com/oog/Query}resource_last_name'): last_name_list.append(resource_last_name.text) for resource_email in root.iter('{http://www.gggg.com/oog/Query}resource_email'): resource_email_list.append(resource_email.text) for resource_user_name in root.iter('{http://www.gggg.com/oog/Query}resource_user_name'): resource_user_name_list.append(resource_user_name.text) rows = zip(dim_id_list, full_name_list, first_name_list, last_name_list, resource_email_list, resource_user_name_list) with open('test.csv', "w", encoding='utf16', newline='') as f: writer = csv.writer(f) for row in rows: writer.writerow(row)
Is there a better way to loop through the Records? This code is terribly verbose. I tried this:
for record in root.findall('.//{http://www.gggg.com/oog/Query}Record'): dim_id = record.find('dim_id').text # Extract each attribute, save to list. etc.
But I am getting attribute errors trying to access each record's text property.