使用Python与Pandas从嵌套XML提取指定属性导出为CSV的问题
XML嵌套结构转指定字段CSV解决方案
核心需求
- 从给定嵌套XML中仅提取指定字段输出为CSV,不输出多余属性
- 需提取字段:CreationTime、FileType、SerialNumber、Check OCV(Check OCV需拼接数值和单位)
- 期望输出样例:
CreationTime,FileType,SerialNumber,Check OCV 2020-09-28T09:42:07.3875529+02:00,Test Report,324,49.429V
原始XML结构样例
<TestReport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" id="33357fcc-edf2-3ad4-a6f2-588a9492f804" source="OI Stand" converter="irs_xml.xsl" version="1.6"> <FileType>Test Report</FileType> <CreationTime>2020-09-28T09:42:07.3875529+02:00</CreationTime> <TestExecution start="2265.595799" time="68.619646" id="009b96f0-9d26-4226-9c9a-7364dcab0467" ts="2020-09-28T09:40:58"> <Attr name="ProductNumber" type="String" value="11266" /> <Attr name="SerialNumber" type="Number" value="324" /> <TestSteps> <TestStep measid="CNID_0210" measname="UART Read Node ID" status="Passed" datatype="Boolean" value="True" stepname="[CNID_0210] UART Read Node ID" steptype="PassFailTest" start="2277.5219649" time="0.0280892" stepid="ID#:Ua1/2g1/6hGrTAABBUH5EC" group="[CNID] Config Node ID"> <Attr name="ReadNodeId Cmd" type="String" value="RAC" /> <Attr name="NodeId" type="String" value=" 255" /> </TestStep> <TestStep measid="MOCV_1510" measname="Check OCV" status="Passed" datatype="Number" limlo="49.000" value="49.429" limhi="51.400" unit="V" stepname="[MOCV_1510] Check OCV" steptype="Test" start="2309.5348324" time="5.72E-05" stepid="ID#:pIldp+t98hG/wTz4Yu5AjB" group="[MOCV] Measure OCV" /> </TestSteps> <PartNr /> </TestExecution> </TestReport>
调整后可直接运行的代码
import xml.etree.ElementTree as ET import pandas as pd # 解析XML文件 tree = ET.parse('324.irp') root = tree.getroot() # 初始化存储结果的字典 result = {} # 提取根节点下的固定字段 result['CreationTime'] = root.find("CreationTime").text result['FileType'] = root.find("FileType").text # 提取Attr节点中指定字段 for attr_node in root.iter('Attr'): attr_name = attr_node.attrib.get('name') if attr_name == 'SerialNumber': result['SerialNumber'] = attr_node.attrib.get('value') # 找到目标后可提前终止循环提高效率 break # 提取TestStep节点中指定字段 for step_node in root.iter('TestStep'): meas_name = step_node.attrib.get('measname') if meas_name == 'Check OCV': val = step_node.attrib.get('value', '') unit = step_node.attrib.get('unit', '') result['Check OCV'] = f"{val}{unit}" # 找到目标后可提前终止循环提高效率 break # 转换为DataFrame并输出CSV df = pd.DataFrame([result]) df.to_csv(r'C:\Users\PycharmProjects\pythonProject\output.csv', index=False)
代码逻辑说明
- 全程仅匹配目标字段,不会输出多余属性
- 匹配到目标节点后直接终止遍历,避免无效循环
- 自动拼接Check OCV的数值和单位,符合输出要求
- 后续需要新增提取字段时,只需在对应遍历分支中增加判断条件即可,扩展成本低
内容的提问来源于stack exchange,提问作者K.Stefan
相关产品推荐
相关产品推荐

