如何使用Python读取.fil文件并提取其中的XML内容
从.fil文件中提取XML内容的实操方案
.fil是通用自定义扩展名,不存在统一格式标准,直接按纯文本/纯二进制读取失败基本都是因为文件带自定义头、特殊编码、或做了简单封装,按以下步骤排查即可:
- 第一步:定位XML片段的起始偏移
绝大多数业务系统生成的带XML的.fil文件,只会在文件开头写入若干字节的自定义标识头,后续紧跟完整XML内容,先通过二进制匹配找到XML起点:with open("target.fil", "rb") as f: raw = f.read() # 优先匹配XML标准声明头 start_pos = raw.find(b"<?xml") if start_pos == -1: # 无声明头则匹配第一个标签起始符 start_pos = raw.find(b"<") xml_raw = raw[start_pos:] - 第二步:按正确编码解码内容
不要默认用UTF-8解码,很多工业/老系统导出的XML会用GBK、GB2312、Latin-1编码,先从XML片段头部提取编码声明:
如果解码后内容正常无乱码,直接进入解析步骤即可。import re enc_match = re.search(rb"encoding=[\"'](.*?)[\"']", xml_raw[:100]) enc = enc_match.group(1).decode("ascii") if enc_match else "utf-8" xml_str = xml_raw.decode(enc, errors="ignore") - 第三步:特殊封装场景排查
如果上述步骤拿到的内容是乱码,按优先级排查两种常见封装:- 压缩封装:不少系统会把XML打包成zip后直接改后缀为.fil,直接用zipfile试读即可:
import zipfile try: with zipfile.ZipFile("target.fil") as zf: # 打印包内文件列表,找到xml后缀的文件读取 print("包内文件:", zf.namelist()) xml_str = zf.read(zf.namelist()[0]).decode("utf-8") except zipfile.BadZipFile: pass - 简单字节混淆:部分老系统会对文件内容做固定值异或混淆,已知XML首字符必然是
<(ASCII码60),拿文件首字节和60做异或即可拿到密钥,遍历所有字节异或后就能得到原始XML。
- 压缩封装:不少系统会把XML打包成zip后直接改后缀为.fil,直接用zipfile试读即可:
- 第四步:解析XML内容
拿到合法的XML字符串后,直接用Python标准库解析即可,无需安装第三方依赖:import xml.etree.ElementTree as ET root = ET.fromstring(xml_str) # 按需提取节点内容,例如遍历所有指定标签 for node in root.iter("目标标签名"): print(node.text, node.attrib)
注意:如果定位到XML起始位置后,尾部存在非XML的冗余二进制内容,可以通过匹配XML根节点的闭合标签位置截断,避免解析报错。
内容的提问来源于stack exchange,提问作者Raks
相关产品推荐
相关产品推荐

