【发布时间】:2012-04-06 06:11:40
【问题描述】:
如何使用 sax 读取 XML 文件并将其转换为 lxml etree.iterparse 元素?
为了提供对该问题的概述,我使用 lxml 构建了一个 XML 摄取工具,用于 XML 提要,其大小范围为 25 - 500MB,需要每天两次摄取,但需要执行一次60 - 100GB 文件的时间摄取。
我选择使用 lxml 是基于详细说明节点大小不超过 4 -8 GB 的规范,我认为这将允许将节点读入内存并在完成时清除。
如果代码如下所示的概述
elements = etree.iterparse(
self._source, events = ('end',)
)
for event, element in elements:
finished = True
if element.tag == 'Artist-Types':
self.artist_types(element)
def artist_types(self, element):
"""
Imports artist types
:param list element: etree.Element
:returns boolean:
"""
self._log.info("Importing Artist types")
count = 0
for child in element:
failed = False
fields = self._getElementFields(child, (
('id', 'Id'),
('type_code', 'Type-Code'),
('created_date', 'Created-Date')
))
if self._type is IMPORT_INC and has_artist_type(fields['id']):
if update_artist_type(fields['id'], fields['type_code']):
count = count + 1
else:
failed = True
else:
if create_artist_type(fields['type_code'],
fields['created_date'], fields['id']):
count = count + 1
else:
failed = True
if failed:
self._log.error("Failed to import artist type %s %s" %
(fields['id'], fields['type_code'])
)
self._log.info("Imported %d Artist Types Records" % count)
self._artist_type_count = count
self._cleanup(element)
del element
如果我可以添加任何类型的说明,请告诉我。
【问题讨论】:
-
那么问题是什么?您收到错误消息了吗?
-
问题就在第一句话中……为什么要投反对票?
-
你的问题有点奇怪。你为什么要使用 SAX? iterparse 是SAX 的替代品。您可以从 SAX 事件生成 iterparse 事件,但为什么有人会这样做呢?
-
据我了解,lxml 不会流式传输文件并将其完全读入内存(或至少是正在读取的节点)。要流式传输它,我需要使用 SAX,但我已经在 lxml 中构建了整个摄取,并且转换是不可能的。
-
iterparse不会将整个文件读入内存。它构建了一棵树,但是是增量的。使用clear()处理完节点后删除节点