user13740263
user13740263

Reputation: 3

Not getting anything while parsing xml file in python

I am a beginner in python and trying to parse the below string from xmlfile where I can get an output like below :

Expected output :{macman:(linkedin,facebook,stack overflow)}

so that I can find out which user has which clients

XML File :  <user name="macman">  <client name="linkedin" /> 
<client name="facebook" />  <client name="stack overflow" /> 
</user>

Code i am trying :

import urllib.request as url
import xml.etree.ElementTree as ET

xmlfile=url.urlopen(r'file:///D:/Python/user.html')

tree=ET.parse(xmlfile)

root=tree.getroot()
print(root.tag)

for item in root.findall("./user"):
   users={}
   for child in item:
      users[child.tag]=child.text
   print(users)

Upvotes: 1

Views: 77

Answers (2)

balderman
balderman

Reputation: 23815

Below

import xml.etree.ElementTree as ET


xml =  '''<r><user name="macman1">  <client name="linkedin1" /> 
<client name="facebook1" />  <client name="stack overflow1" /> 
</user><user name="macman2">  <client name="linkedin2" /> 
<client name="facebook2" />  <client name="stack overflow2" /> 
</user></r>'''

root = ET.fromstring(xml)
data = {u.attrib['name']: [c.attrib['name'] for c in u.findall('./client')] for u in root.findall('.//user')}
print(data)

output

{'macman2': ['linkedin2', 'facebook2', 'stack overflow2'], 'macman1': ['linkedin1', 'facebook1', 'stack overflow1']}

Upvotes: 0

Anwarvic
Anwarvic

Reputation: 12992

You need to findall() the client not the user. So, your code should look like this:

...
users = {root.get("name"): []}
for item in root.findall("client"):
    users[root.get("name")].append(item.get("name"))

print(users)
#{'macman': ['linkedin', 'facebook', 'stack overflow']}

Upvotes: 1

Related Questions