如何用Python提取XML首个M标签指定PAR节点转为Pandas DataFrame
解决方案
方案一:优化XPath直接读取(推荐中小文件使用)
直接调整XPath筛选规则,一步读取符合要求的节点:
import pandas as pd # xpath说明: # //SUBL1/M[1] 定位到SUBL1下的第一个<M>标签 # PAR[NAME=('A','C','E')] 筛选NAME值为A/C/E的<PAR>节点 df = pd.read_xml( path2file, xpath="//SUBL1/M[1]/PAR[NAME=('A','C','E')]" ) # 过滤空DESC列,errors="ignore"避免无DESC列时报错 df = df.drop(columns=["DESC"], errors="ignore")
如果使用的pandas版本较低不支持XPath多值匹配,可以替换为兼容写法:xpath="//SUBL1/M[1]/PAR[NAME='A' or NAME='C' or NAME='E']"
方案二:流式解析(推荐超大业务文件使用)
对于体量较大的文件,用迭代解析方式可以大幅降低内存占用,且处理完第一个
import xml.etree.ElementTree as ET import pandas as pd target_names = {"A", "C", "E"} result = [] # 流式迭代解析XML,无需加载整个文件到内存 for event, elem in ET.iterparse(path2file, events=("end",)): # 匹配到第一个<M>标签后处理内部节点 if elem.tag == "M" and elem == elem.getparent().find("M"): for par_node in elem.findall("PAR"): par_name = par_node.findtext("NAME") if par_name in target_names: result.append({ "NAME": par_name, "TYPE": par_node.findtext("TYPE"), "VAL": par_node.findtext("VAL") }) # 第一个<M>处理完成直接终止解析,跳过后续内容 break # 清理已处理节点释放内存 elem.clear() df = pd.DataFrame(result)
内容的提问来源于stack exchange,提问作者Arunakiri Venkatachalam
相关产品推荐
相关产品推荐

