如何修改Python代码实现基于<project>节点拆分大型XML文件
拆分大型XML文档为单个节点文件
我需要把一个包含88645行的大型XML文档,按<project>节点拆分成多个独立的XML文件。原XML结构如下:
<?xml version="1.0" encoding="UTF-8"?> <projects> <project> <projectNumber>738951</projectNumber> <projectType>CHANGE REQUEST</projectType> <lineOfBusiness>COMMERCIAL</lineOfBusiness> ... </project> </projects>
目标是生成多个如下格式的独立XML文件:
XML 1:
<?xml version="1.0" encoding="UTF-8"?> <project> <projectNumber>738951</projectNumber> <projectType>CHANGE REQUEST</projectType> <lineOfBusiness>COMMERCIAL</lineOfBusiness> ... </project>
XML 2:
<?xml version="1.0" encoding="UTF-8"?> <project> <projectNumber>738952</projectNumber> <projectType>CHANGE REQUEST</projectType> <lineOfBusiness>COMMERCIAL</lineOfBusiness> ... </project>
我之前基于硬编码XML片段写了初始代码,但需要修改成读取实际大型XML文件的版本:
初始代码:
import xml.etree.ElementTree as ET xml = '''<projects> <project> <projectNumber>738951</projectNumber> <projectType>CHANGE REQUEST</projectType> <lineOfBusiness>COMMERCIAL</lineOfBusiness> ... ''' root = ET.fromstring(xml) counter = 1 for child in list(root): if child.tag.startswith('project'): src = ET.Element('project') src.append(child) with open(f'out_{counter}.xml','w') as f: tree = ET.ElementTree(src) tree.write(f,encoding="unicode") counter += 1
修改后的代码(支持读取大型XML文件)
import xml.etree.ElementTree as ET # 替换为你的大型XML文件路径 input_file = "large_projects.xml" counter = 1 # 流式解析大文件,避免一次性加载全部内容到内存 for event, elem in ET.iterparse(input_file, events=('start', 'end')): if event == 'end' and elem.tag == 'project': # 直接以当前project节点作为根节点创建树 tree = ET.ElementTree(elem) # 写入文件并保留XML声明 with open(f'out_{counter}.xml', 'w', encoding='UTF-8') as f: tree.write(f, encoding='UTF-8', xml_declaration=True) # 清理已处理节点,释放内存 elem.clear() counter += 1
关键改动说明
- 改用
ET.iterparse流式解析:不会把8万多行的整个文件加载到内存,避免内存溢出,适合处理大型XML。 - 监听
end事件:确保只在完整读取一个<project>节点后再处理,避免生成不完整的XML文件。 - 保留XML声明:通过
xml_declaration=True让输出文件包含标准的XML声明头,符合目标格式要求。 - 内存清理:处理完每个节点后调用
elem.clear(),及时释放已处理节点占用的内存,防止内存占用过高。 - 简化节点处理:直接使用读取到的
<project>节点作为输出文件的根节点,无需额外创建新元素再追加。
内容的提问来源于stack exchange,提问作者moran29
相关产品推荐
相关产品推荐

