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

从TeamCity Rest API的XML文件中提取Build ID并存储到列表

从TeamCity XML中提取Build ID的解决方案

问题场景

需要从TeamCity REST API返回的XML结果中提取所有Build ID并存储到列表,XML格式如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<builds count="3" href="/app/rest/buildTypes/id:<id>/builds?locator=startDate:20230401T000000-0400,untilDate:20230431T000000-0400">
    <build id="419618" buildTypeId="Azure_Dev_ExternalSummary" number="E-9020" >
        <finishOnAgentDate>20230422T021844-0400</finishOnAgentDate>
    </build>
    <build id="419017" buildTypeId="Azure_Dev_ExternalSummary" number="E-9002"> 
        <finishOnAgentDate>20230420T173730-0400</finishOnAgentDate>
    </build>
    <build id="418538" buildTypeId="Azure_Dev_ExternalSummary" number="E-8987">
        <finishOnAgentDate>20230419T160253-0400</finishOnAgentDate>
    </build>
</builds>

但使用ElementTree解析时出错,尝试的错误代码如下:

def extract_build_id(xmlfile):
    tree = ET.parse(xmlfile)

    root = tree.getroot()

    ids = []
    print('')
    for item in root.findall(''):
        print(item)

错误原因

代码中root.findall('')使用了空选择器,无法匹配任何XML元素,自然无法提取到Build ID。

正确的ElementTree实现

ElementTree完全适合处理这类XML解析需求,修正后的代码如下:

解析XML文件

import xml.etree.ElementTree as ET

def extract_build_id(xmlfile):
    tree = ET.parse(xmlfile)
    root = tree.getroot()
    
    build_ids = []
    # 遍历所有<build>子元素
    for build in root.findall('build'):
        # 提取build标签的id属性值
        id_value = build.get('id')
        if id_value:
            build_ids.append(id_value)
    return build_ids

简化版(列表推导式)

import xml.etree.ElementTree as ET

def extract_build_id(xmlfile):
    tree = ET.parse(xmlfile)
    root = tree.getroot()
    # 直接筛选并提取有效id
    return [build.get('id') for build in root.findall('build') if build.get('id')]

解析API返回的XML字符串

如果是直接从API获取的XML字符串而非文件,可改用ET.fromstring()解析:

import xml.etree.ElementTree as ET

def extract_build_id_from_api_response(xml_str):
    root = ET.fromstring(xml_str)
    return [build.get('id') for build in root.findall('build') if build.get('id')]

其他可选方案

如果偏好更简洁的语法,也可以使用lxml库(需额外安装),但ElementTree作为Python标准库,无需额外依赖,完全能满足需求。

内容的提问来源于stack exchange,提问作者Chandler Cree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:35:13