You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:51:25