如何从XML文件中提取指定属性的所有属性值
问题场景
给定如下结构的XML赛段数据文件,需要提取所有<Lap>标签中twrr属性对应的取值,示例XML片段如下:
<LapRankIncludingDiscos>1</LapRankIncludingDiscos> <Lap num="1" p="1" et="40.3468" s1="24.2085" s2="20.8324" s3="29.3612" fuel="0.969" twfl="0.996" twfr="0.996" twrl="0.996" twrr="0.996" fcompound="0,Michelin" rcompound="0,Michelin">74.4021</Lap> <Lap num="2" p="1" et="114.7489" s1="19.2400" s2="20.9481" s3="29.2010" fuel="0.945" twfl="0.992" twfr="0.992" twrl="0.992" twrr="0.992" fcompound="0,Michelin" rcompound="0,Michelin">69.3891</Lap> <Lap num="3" p="1" et="184.1380" s1="19.1381" s2="20.8024" s3="29.2390" fuel="0.918" twfl="0.988" twfr="0.992" twrl="0.988" twrr="0.988" fcompound="0,Michelin" rcompound="0,Michelin">69.1795</Lap> <Lap num="4" p="1" et="253.3175" s1="19.2191" s2="20.6913" s3="29.1175" fuel="0.894" twfl="0.984" twfr="0.988" twrl="0.984" twrr="0.984" fcompound="0,Michelin" rcompound="0,Michelin">69.0280</Lap> <Lap num="5" p="1" et="322.3455" s1="19.0733" s2="20.6675" s3="29.1936" fuel="0.867" twfl="0.976" twfr="0.984" twrl="0.980" twrr="0.980" fcompound="0,Michelin" rcompound="0,Michelin">68.9343</Lap> <Lap num="6" p="1" et="391.2798" s1="19.1766" s2="20.8935" s3="29.4496" fuel="0.843" twfl="0.973" twfr="0.980" twrl="0.976" twrr="0.976" fcompound="0,Michelin" rcompound="0,Michelin">69.5196</Lap>
可行实现方案
方案1:Python 标准库解析(优先推荐,无第三方依赖)
用Python自带的XML解析库处理,不会因为XML格式微调出错,稳定性最高:
import xml.etree.ElementTree as ET # 把括号里的路径替换成你自己的XML文件实际路径 xml_tree = ET.parse("lap_data.xml") root = xml_tree.getroot() twrr_result = [] # 遍历所有Lap节点,提取twrr属性 for lap_node in root.iter("Lap"): twrr_val = lap_node.get("twrr") if twrr_val: # 需要字符串类型就直接存,需要数值就转float twrr_result.append(float(twrr_val)) print(twrr_result)
针对示例数据的运行输出:
[0.996, 0.992, 0.988, 0.984, 0.98, 0.976]
方案2:命令行一键提取(适合快速处理文件)
如果是Linux/macOS环境,安装xmlstarlet工具后,单条命令即可输出所有结果:
xmlstarlet sel -t -v "//Lap/@twrr" -n lap_data.xml
执行后会逐行打印所有twrr属性值。
方案3:正则临时匹配(仅推荐格式固定的一次性场景)
如果只是临时处理、不想引入解析逻辑,且XML格式和示例完全一致,可以用正则直接匹配取值。注意如果XML出现属性顺序调整、引号类型变化、标签嵌套变动,该方案会失效:
import re with open("lap_data.xml", "r", encoding="utf-8") as f: file_content = f.read() # 匹配twrr="xxx"格式里引号包裹的数值 twrr_result = re.findall(r'twrr="([\d.]+)"', file_content) # 转数值类型 twrr_result = [float(v) for v in twrr_result] print(twrr_result)
注意:生产场景、长期使用的脚本不要用正则处理XML,优先选正规XML解析方案,避免格式变动导致匹配异常。
内容的提问来源于stack exchange,提问作者Mika Hakimi
相关产品推荐
相关产品推荐

