XML模板使用大型生成器渲染段错误

时间:2013-10-25 13:21:03

标签: python xml generator lxml mako

我正在尝试转换大约。通过将某个标记的所有元素放在新文件中,将100MB XML文件转换为另一个XML文件。由于传统写作导致内存问题,我想使用Mako模板这样做。 XML中有大约60000个元素,为了保持较低的内存使用率,我尝试将生成器传递给模板。但是,这导致了段错误。我对内存管理的了解非常少,但它似乎与将内容放在模板中有关,就像我打印'元素时没有出现问题一样。我是否滥用模板渲染它不适合的东西?怎么解决这个问题?

我的渲染代码:

from lxml import etree
from mako.template import Template
from mako.runtime import Context

ns = {'xmlns': 'http://namesp.ace/version/1'}
## get xml elements with correct tag
featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'], events=('start',))
templatefn = 'template.mako'
# create template
template = Template(filename=templatefn)
with open('outfile', 'w') as fp:
    ctx = Context(fp, tag=featgen)
    template.render_context(ctx)

模板:

<%! from lxml import etree
def tostr_xml(el, ns):
    strxml = etree.tostring(el)
    el.clear()
    strxml = strxml.replace('xmlns="{0}" '.format(ns['xmlns']), '')
    strxml = strxml.replace('xmlns:p="{0}" '.format(ns['xmlns:p']), '')
    strxml = strxml.replace('xmlns:xsi="{0}" '.format(ns['xmlns:xsi']), '')
    return strxml
%>
<?xml version='1.0' encoding='ASCII'?>
<root>
  <features>
    % for ev,el in tag:
    ${tostr_xml,el, {'xmlns':'http://namesp.ace/version/1'})}
    % endfor
  </features>
</root>

1 个答案:

答案 0 :(得分:0)

我转过来解决了这个问题:

featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'], events=('start',))

成:

featgen = etree.iterparse('somefile.xml', tag='{%s}sometag' % ns['xmlns'])

但我不能说为什么会这样。如果有人想解释我会接受这个答案。