如何从多级XML提取属性值并转换为指定<set>标签格式?
解决方案
步骤说明
- 修复XML结构: 原始XML片段缺少根节点,需先包裹在临时根标签内确保解析有效。
- 解析并排序等级: 使用
xml.etree.ElementTree解析XML,按val属性排序等级节点,保证数据顺序正确。 - 收集指标数据: 遍历每个等级节点,提取各指标(hp、mp等)的值并按类别存储。
- 生成目标格式: 将每个类别的值用分号拼接,生成
<set>标签字符串。
Python代码实现
import xml.etree.ElementTree as ET # 原始XML输入(可替换为从文件读取) input_xml = """ <levels> <level val="1"> <hp>94</hp> <mp>30</mp> <cp>37.6</cp> <hpRegen>2</hpRegen> <mpRegen>0.9</mpRegen> <cpRegen>2</cpRegen> </level> <level val="2"> <hp>107.65</hp> <mp>35.46</mp> <cp>43.06</cp> <hpRegen>2</hpRegen> <mpRegen>0.9</mpRegen> <cpRegen>2</cpRegen> </level> <level val="3"> <hp>121.45</hp> <mp>40.98</mp> <cp>48.58</cp> <hpRegen>3</hpRegen> <mpRegen>0.9</mpRegen> <cpRegen>2</cpRegen> </level> </levels> """ # 解析XML root = ET.fromstring(input_xml) # 按等级值排序节点,确保顺序正确 levels = sorted(root.findall('level'), key=lambda x: int(x.get('val'))) # 收集各指标数据 metric_data = {} for level in levels: for metric in level: metric_tag = metric.tag value = metric.text.strip() if metric_tag not in metric_data: metric_data[metric_tag] = [] metric_data[metric_tag].append(value) # 生成目标格式输出 output_lines = [] for tag, values in metric_data.items(): table_attr = f"{tag}Table" values_str = ";".join(values) output_lines.append(f' <set {table_attr}="{values_str}"/>') # 打印结果 print("\n".join(output_lines))
运行结果
<set hpTable="94;107.65;121.45"/> <set mpTable="30;35.46;40.98"/> <set cpTable="37.6;43.06;48.58"/> <set hpRegenTable="2;2;3"/> <set mpRegenTable="0.9;0.9;0.9"/> <set cpRegenTable="2;2;2"/>
注意事项
- 如果原始XML来自文件,可将
input_xml替换为文件读取代码:with open('input.xml', 'r') as f: input_xml = f.read() - 代码会自动处理所有
<level>节点下的子标签,无需硬编码指标名称,适配扩展需求。
内容的提问来源于stack exchange,提问作者Kalampoki
相关产品推荐
相关产品推荐

