python - 修复格式错误的 xml 时出现内存错误
问题描述
我有一些非常大的格式错误的 XML——它缺少顶级标记并且有重复的属性。为了解决这个问题,我在我的格式错误的 XML 的一个子集上测试了以下解决方案,它可以完美地添加标签并使用BeautifulSoup
.
import sys
from bs4 import BeautifulSoup
import xml.etree.ElementTree as ET
flow_file = sys.stdin.read()
try:
tree = ET.fromstring(flow_file)
sys.stdout.write(flow_file)
except:
flow_file = f"<dispatch>{flow_file}</dispatch>"
soup = BeautifulSoup(flow_file, 'xml')
sys.stdout.write(soup)
但是,由于我的真实文件太大,它会引发内存错误。由于我需要(AFAICT)完整的 XML 来添加顶级标签并删除重复项,因此我不太确定如何修改我的代码来处理如此大的 XML。我看到了一些使用lxml
和迭代的建议,但我不清楚它如何适合我的需求/流程。
ETA:不确定是否有帮助,但这样做的重点是清理文件,以便它可以通过 NiFi 的SplitXML
处理器运行。
解决方案
由于我真的不知道你对数据做了什么,这里是我对几个 GB 大 xml 文件采取的方法:
import xml.etree.ElementTree as etree
root = False
#iterparse file, get event tags start and end
for event, elem in etree.iterparse("my_big.xml", events=('start', 'end')):
#set first element as rootelement, so we can clear it later
if event == "start" and root == "False":
root = elem
#Here we look for a certain end tag
if event == "end" and elem.tag == "TAGOFINTEREST":
#set found False, so we can break, as soon, as we found our DataOfInterest
found = False
#iterate through children and iterate over child nodes
#HERE I guess you would work with pandas
for stuff in elem.getchildren():
#if found == True stop iterating or whatever condition you have
if found:
break
#look for what you need, set found to True and break the
found = True
#clear elem, in order to save RAM
elem.clear()
#Might require revision clears RAM after every "end" event
if event == "end":
root.clear()
我希望这有帮助。
推荐阅读
- html - 将元素拉伸到自动计算网格的末尾,而不仅仅是显式网格
- powershell - 同时使用桌面 Powershell 5.1 和 Powershell Core 6.1
- cmake - 在 cmake 中命名可执行文件
- tfvc - TFS2018 TFVC On-Premise Build Definition 如何在其他团队项目中包含解决方案
- java - Google Cloud Speech to Text 错误:java.lang.NoSuchMethodError:没有虚拟方法 build()Lcom/google/protobuf/GeneratedMessageLite;
- css - 使用 3d css 变换旋转对象时,如何保持方向不变,即“越过顶部”而不是向后
- hazelcast - Payara4/Hazelcast x 第一次失败的容错
- scala - 将文件从 Hdfs 复制到 Hdfs scala
- python - 使用堆栈或熔化在交叉表中重塑数据
- jquery - 如何获取特定(此)行的列值?