使用Python ElementTree解析Crowd API XML提取组及用户数据
Python 解析 Atlassian Crowd XML 成员数据实现方案
针对Crowd REST API返回的XML格式成员关系数据,可直接使用如下基于ElementTree的实现,满足组名提取、组-用户映射生成、指定组用户查询三类需求,同时兼容本地XML文件、接口返回字节流两种输入源。
核心实现代码
import xml.etree.ElementTree as ET import requests def parse_crowd_membership(xml_source): """ 解析Crowd成员关系XML :param xml_source: 支持本地文件路径、bytes格式的XML响应内容 :return: 全量组名列表、组名-用户名映射字典 """ # 兼容两种输入格式 if isinstance(xml_source, bytes): root = ET.fromstring(xml_source) else: tree = ET.parse(xml_source) root = tree.getroot() group_user_map = {} # 遍历所有成员组节点 for membership in root.findall(".//membership"): group_name = membership.get("group") if not group_name: continue # 提取当前组下所有用户 user_list = [] for user in membership.findall("./users/user"): username = user.get("name") if username: user_list.append(username) group_user_map[group_name] = user_list all_groups = list(group_user_map.keys()) return all_groups, group_user_map def get_users_by_group(group_name, group_user_map): """查询指定分组下的全部用户,组不存在时返回空列表""" return group_user_map.get(group_name, [])
使用示例
解析本地crowd.xml文件
if __name__ == "__main__": # 加载本地XML文件 all_groups, group_map = parse_crowd_membership("crowd.xml") # 1. 获取所有组名 print("所有用户组:", all_groups) # 2. 获取组-用户映射字典 print("组用户对应关系:", group_map) # 3. 查询指定组下的用户 print("crowd-administrators组成员:", get_users_by_group("crowd-administrators", group_map)) print("developers组成员:", get_users_by_group("developers", group_map))
上述代码运行后输出如下:
所有用户组: ['crowd-administrators', 'developers'] 组用户对应关系: {'crowd-administrators': ['admin', 'bilcy@abc.com'], 'developers': ['johns', 'millers', 'peeryj']} crowd-administrators组成员: ['admin', 'bilcy@abc.com'] developers组成员: ['johns', 'millers', 'peeryj']
解析接口实时返回的XML
注意:请求接口时建议增加状态码校验,避免把鉴权失败、服务报错返回的非XML内容传入解析逻辑
def fetch_crowd_membership(): url = 'http://localhost:8095/crowd/rest/usermanagement/latest/group/membership' resp = requests.get(url, auth=("app-name", "passwd")) resp.raise_for_status() # 接口请求失败时直接抛出异常 all_groups, group_map = parse_crowd_membership(resp.content) return all_groups, group_map
之前测试代码无输出排查点
- 确认
crowd.xml文件路径正确,路径错误触发的FileNotFoundError如果被外层异常捕获吞掉,就会表现为无输出 - XPath查询建议基于
root节点调用,不要直接在tree对象上调用多层路径,层级匹配稳定性更高 - 解析接口返回内容前,先确认接口返回状态为200,避免传入HTML报错页、空响应等无效内容
内容的提问来源于stack exchange,提问作者bilcy
相关产品推荐
相关产品推荐

