Last active
May 27, 2018 11:27
-
-
Save nobbynobbs/1fa8c1fa959f2d3e70abbdaa76d6e827 to your computer and use it in GitHub Desktop.
answer for stackoverflow
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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