如何用Python xml.etree.ElementTree提取XML指定ID对应的值
提取XML中指定ObjectType下的特征值到字典
需求说明
遍历XML中的ObjectHeader标签,当子节点ObjectType/Id的值为1424时,提取ObjectVariant/ObjectValue下Characteristic/Name与PropertyValue/Value的内容,将其存入字典,预期输出格式为:
{"Var1": 10.4, "Var2": 15.6}
XML文件共3万行,且ID 1424仅出现一次。
示例XML片段
<ObjectContext> <ObjectHeader> <ObjectType> <Id>1278</Id> <Name>ID_NAME</Name> </ObjectType> <ObjectVariant> <ObjectValue> <Characteristic> <Name>Var1</Name> <Description>Something about the name</Description> </Characteristic> <PropertyValue> <Value>10.6</Value> <Description>Something about the value</Description> </PropertyValue> </ObjectValue> </ObjectVariant> </ObjectHeader> <ObjectHeader> <ObjectType> <Id>1424</Id> <Name>ID_NAME</Name> </ObjectType> <ObjectVariant> <ObjectValue> <Characteristic> <Name>Var1</Name> <Description>Something about the name</Description> </Characteristic> <PropertyValue> <Value>10.4</Value> <Description>Something about the value</Description> </PropertyValue> </ObjectValue> <ObjectValue> <Characteristic> <Name>Var2</Name> <CharacteristicType>Something about the name</CharacteristicType> </Characteristic> <PropertyValue> <Value>15.6</Value> <Description>Something about the value</Description> </PropertyValue> </ObjectValue> </ObjectVariant> </ObjectHeader> </ObjectContext>
解决方案代码
针对大文件场景,使用Python的xml.etree.ElementTree模块的iterparse方法逐行解析,避免内存溢出:
import xml.etree.ElementTree as ET result_dict = {} target_found = False # 迭代解析XML文件,处理大文件更高效 for event, elem in ET.iterparse('your_xml_file.xml', events=('start', 'end')): if event == 'end' and elem.tag == 'ObjectHeader': if target_found: # 提取当前ObjectHeader下所有ObjectValue的键值对 for obj_value in elem.findall('.//ObjectValue'): char_name = obj_value.find('.//Characteristic/Name').text prop_value = float(obj_value.find('.//PropertyValue/Value').text) result_dict[char_name] = prop_value # 找到目标后立即终止循环(ID1424仅出现一次) break # 检查当前ObjectHeader的类型ID是否为1424 type_id = elem.find('.//ObjectType/Id').text if type_id == '1424': target_found = True # 清理已处理元素,释放内存 elem.clear() print(result_dict)
代码说明
- 高效解析:
iterparse逐行处理XML,无需加载整个3万行文件到内存,适合大文件场景。 - 精准匹配:遍历每个
ObjectHeader标签结束时,检查其ObjectType/Id是否为目标值1424。 - 数据提取:找到目标节点后,遍历其下所有
ObjectValue,提取特征名称和对应数值并转为浮点数存入字典。 - 内存优化:每次处理完元素后调用
elem.clear(),避免内存占用过高。 - 提前终止:由于ID1424仅出现一次,处理完目标节点后立即退出循环,提升执行效率。
内容的提问来源于stack exchange,提问作者Ranieri Bubans
相关产品推荐
相关产品推荐

