You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:06:00