Skip to content

Instantly share code, notes, and snippets.

@nobbynobbs
Last active May 27, 2018 11:27
Show Gist options
  • Save nobbynobbs/1fa8c1fa959f2d3e70abbdaa76d6e827 to your computer and use it in GitHub Desktop.
Save nobbynobbs/1fa8c1fa959f2d3e70abbdaa76d6e827 to your computer and use it in GitHub Desktop.
answer for stackoverflow
import lxml.etree as ET
import csv
# load file
tree = ET.parse('users.xml')
# iterate through each user tag
users = tree.findall('.//user')
all_roles = list({role.find('name').text for role in tree.findall('.//role')})
# just w mode, no wb. wb for binary data
with open('user_list.csv', "w") as csv_file:
writer = csv.writer(csv_file, delimiter=',')
# write headers
writer.writerow([
'email', 'enabled', 'externallyDefined',
'fullName', 'tenantId', 'username', *all_roles
])
for user in users:
email = user.find('emailAddress').text
enabled = user.find('enabled').text
# process optional element
externallyDefined = user.find('externallyDefined')
if externallyDefined is not None:
externallyDefined = externallyDefined.text
fullName = user.find('fullName').text
# another optional element
tenantId = user.find('tenantId')
if tenantId is not None:
tenantId = tenantId.text
username = user.find('username').text
# collect nested elements (roles)
user_roles = {}
roles = user.find('roles').findall('role')
for role in roles:
user_roles[role.find('name').text] = True
writer.writerow([
email, enabled, externallyDefined, fullName,
tenantId, username, *[user_roles.get(role) for role in all_roles]
])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment