如何用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
相关产品推荐
相关产品推荐

