从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
相关产品推荐
相关产品推荐

