有效地解析100 gb xml文件

时间:2018-06-18 02:35:27

标签: python xml algorithm parsing

我的文件有点非结构化和杂乱。 我有foo.xml,其大小为100 gbs文件,例如:

<root>
    <abc>
         <page>
             <code>some_path_1</code>
             <string>another_path_1</string>
         </page>
    </abc>
    <def string="blah">
        <game>some_text_again</game>
        <blah attribs="yes" labs="check">some_text_again</blah>
    </def>
 .
 .
 .
 </root>

我需要的预期输出是:

some_path_1
another_path_1
attrib: string=blah
some_text_again
attrib: attribs=yes, labs=check
some_text_again

目前我正在使用lxml解析器。如:

from lxml import etree
root = etree.parse('foo.xml').getroot()
for i in root.iterchildren():
    # do something

这是一个更好的方法,因为它是一个100 GB的文件。

2 个答案:

答案 0 :(得分:0)

我对一个巨大的文件遇到了同样的问题,发现我必须逐步解析它。

import xml.etree.ElementTree as ET
context = ET.iterparse(result_file_name, events=["end"])
    # turn it into an iterator
    context = iter(context)
    for event, elem in context:
        if event == "end":
        .....

答案 1 :(得分:0)

在启用流媒体的情况下使用XSLT 3.0,这将是:

<xsl:transform version="3.0"
     expand-text="yes" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>
  <xsl:mode on-no-match="shallow-skip"/>
  <xsl:template match="text()">{.}&xa;</xsl:template>
  <xsl:template match="*[@*]">attrib: {
     string-join(@* ! (name() || '=' || .), ', ')
  }&#xa;</xsl:template>
</xsl:transform>