首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析XML以从人群API获取数据值的列表或字典。

解析XML以从人群API获取数据值的列表或字典。
EN

Stack Overflow用户
提问于 2022-06-03 14:03:41
回答 1查看 55关注 0票数 0

我有来自亚特兰西安人群Rest的XML响应示例,而真正的XML响应要大得多。我正在尝试使用Python解析ElementTree。

以下是名为crowd.xml的XML文件

代码语言:javascript
复制
<?xml version='1.0' encoding='utf-8'?>
<memberships>
 <membership group="crowd-administrators">
  <users>
   <user name="admin" />
   <user name="bilcy@abc.com" />
  </users>
  <groups>
  </groups>
 </membership>
 <membership group="developers">
  <users>
   <user name="johns" />
   <user name="millers" />
   <user name="peeryj" />
  </users>
  <groups>
  </groups>
 </membership>
</memberships>

在这个来自亚特兰西安人群的API响应中,我需要提取所有组名的列表,比如人群管理员和开发人员。我需要一个列表或字典的所有用户名在每一组。我还需要列出特定组中的所有用户。

我试图使用XPath,但无法获得组名和用户名的值。

代码语言:javascript
复制
def parseXML(xmlfile):
    tree = ET.parse(xmlfile)
    root = tree.getroot()
    users = tree.findall(".//user[@name='admin']")
    print(users)

parseXML("crowd.xml")

这个不印任何东西。

我能够用ET.fromstring打印出整个XML。

代码语言:javascript
复制
def parseXML2():
    url = 'http://localhost:8095/crowd/rest/usermanagement/latest/group/membership'
    response = requests.get(url, auth=("app-name", "passwd"))
    xml_response = ET.fromstring(response.content)
    print(xml_response)

parseXML2()

为此,我会使用JSON输出,但是这个API不支持JSON输出。不知道如何提取其中的组名和用户。任何帮助提取数据将不胜感激。提亚

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-04 11:38:47

,我需要提取所有组名的列表,比如群管理员和开发人员。我需要一个列表或字典的所有用户名在每一组。

如下所示

代码语言:javascript
复制
import xml.etree.ElementTree as ET
from collections import defaultdict

xml = '''<?xml version='1.0' encoding='utf-8'?>
<memberships>
 <membership group="crowd-administrators">
  <users>
   <user name="admin" />
   <user name="bilcy@abc.com" />
  </users>
  <groups>
  </groups>
 </membership>
 <membership group="developers">
  <users>
   <user name="johns" />
   <user name="millers" />
   <user name="peeryj" />
  </users>
  <groups>
  </groups>
 </membership>
</memberships>
'''

data = defaultdict(list)
root = ET.fromstring(xml)
for m in root.findall('.//membership'):
  group_name = m.attrib['group']
  for u in m.findall('.//user'):
      data[group_name].append(u.attrib['name'])
print(data)

输出

代码语言:javascript
复制
defaultdict(<class 'list'>, {'crowd-administrators': ['admin', 'bilcy@abc.com'], 'developers': ['johns', 'millers', 'peeryj']})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72490800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档