在python中解析大型伪xml文件

时间:2009-10-02 11:15:50

标签: python xml

我正在尝试解析*大型文件(> 5GB)的结构化标记数据。数据格式本质上是XML,但没有明确的根元素。最有效的方法是什么?

SAX解析器的问题是它们需要一个根元素,所以要么我要在数据流中添加一个伪元素(在Python中是否相当于Java的SequenceInputStream?)或者我要切换到非SAX一致的基于事件的解析器(是否有sgmllib的后继?)

数据的结构非常简单。基本上是元素列表:

<Document>
  <docid>1</docid>
  <text>foo</text>
</Document>
<Document>
  <docid>2</docid>
  <text>bar</text>
</Document>

*实际上要迭代

4 个答案:

答案 0 :(得分:11)

http://docs.python.org/library/xml.sax.html

注意,您可以将“stream”对象传递给xml.sax.parse。这意味着您可以将任何具有类文件方法的对象(如read)传递给parse调用...创建自己的对象,首先将您的虚拟根开始标记,然后文件的内容,然后是虚拟根目录标记。我想你只需要实现read方法......但这可能取决于你将使用的sax解析器。

适用于我的示例:

import xml.sax
import xml.sax.handler

class PseudoStream(object):
    def read_iterator(self):
        yield '<foo>'
        yield '<bar>'
        for line in open('test.xml'):
            yield line
        yield '</bar>'
        yield '</foo>'

    def __init__(self):
        self.ri = self.read_iterator()

    def read(self, *foo):
        try:
            return self.ri.next()
        except StopIteration:
            return ''

class SAXHandler(xml.sax.handler.ContentHandler):
    def startElement(self, name, attrs):
        print name, attrs

d = xml.sax.parse(PseudoStream(), SAXHandler())

答案 1 :(得分:1)

快速而肮脏的答案是添加一个根元素(作为String),因此它将是一个有效的XML。

问候。

答案 2 :(得分:1)

添加根元素并使用SAX,STax或VTD-XML ..

答案 3 :(得分:0)

xml.parsers.expat - 使用Expat进行快速XML解析 xml.parsers.expat模块是Expat非验证XML解析器的Python接口。该模块提供单个扩展类型xmlparser,它表示XML解析器的当前状态。创建xmlparser对象后,可以将对象的各种属性设置为处理函数。当XML文档随后被提供给解析器时,将为XML文档中的字符数据和标记调用处理函数。

更多信息:http://www.python.org/doc/2.5/lib/module-xml.parsers.expat.html