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

如何用Python从含XML的TXT文件提取多值并导出至Excel

从多XML文本中提取指定字段并生成Excel的解决方案

正则处理XML容易因标签嵌套、属性格式变化导致匹配失败,用XML专用解析库+数据处理库是更可靠的方案,以下是基于Python的实现步骤:

依赖准备

安装必要的库:

pip install pandas lxml

具体实现步骤

1. 分割TXT中的多XML块

由于TXT中存储了多条独立XML,先通过正则分割出每个完整的XML片段(假设每条XML的根标签以RQ或RS结尾,可根据实际结构调整正则):

2. 解析XML提取目标字段

用lxml解析每个XML片段,精准提取:

  • Type:XML根标签的名称(如ServiceRQ)
  • Channel:对应标签的文本或属性值
  • AG的Value:AG标签的value属性值

3. 生成Excel表格

用pandas将提取的数据整理成DataFrame,直接导出为Excel。

完整代码示例

import re
import pandas as pd
from lxml import etree

def split_xml_blocks(txt_content):
    # 匹配以RQ/RS结尾的根标签包裹的完整XML块,支持跨行匹配
    xml_pattern = re.compile(r'<([A-Za-z0-9]+RQ|RS)>.*?</\1>', re.DOTALL)
    return xml_pattern.findall(txt_content)

def extract_fields(xml_str):
    try:
        root = etree.fromstring(xml_str)
        # 提取根标签作为Type
        xml_type = root.tag
        # 提取Channel:优先找根节点下的Channel文本,否则找所有层级的Channel属性
        channel = root.findtext('Channel') or ''
        if not channel and root.find('.//Channel') is not None:
            channel = root.find('.//Channel').get('value', '')
        # 提取第一个AG标签的value属性
        ag_value = root.find('.//AG').get('value', '') if root.find('.//AG') is not None else ''
        return {
            'Type': xml_type,
            'Channel': channel,
            'AG_Value': ag_value
        }
    except Exception as e:
        print(f"解析XML片段失败: {str(e)}")
        return None

# 主执行流程
if __name__ == '__main__':
    # 读取XML文本文件
    with open('xml_data.txt', 'r', encoding='utf-8') as f:
        raw_content = f.read()
    
    # 分割得到所有XML块
    xml_blocks = split_xml_blocks(raw_content)
    
    # 批量提取字段
    result_data = []
    for block in xml_blocks:
        field_data = extract_fields(block)
        if field_data:
            result_data.append(field_data)
    
    # 生成Excel
    if result_data:
        df = pd.DataFrame(result_data)
        df.to_excel('extracted_result.xlsx', index=False)
        print("提取完成,结果已保存到extracted_result.xlsx")
    else:
        print("未提取到有效数据")

适配调整说明

  • 如果XML结构不同(比如Channel在特定子节点下、存在多个AG标签),修改find/findtext的路径即可,例如找特定路径的Channel:root.find('./Header/Channel')
  • 若TXT中XML的分割规则不是RQ/RS根标签,调整split_xml_blocks中的正则表达式,比如匹配任意根标签:r'<([A-Za-z0-9]+)>.*?</\1>'
  • 处理非UTF-8编码的TXT文件时,修改open函数的encoding参数(如encoding='gbk')

内容的提问来源于stack exchange,提问作者Rejoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:10:14