我正在尝试解析*大型文件(> 5GB)的结构化标记数据。数据格式本质上是XML,但没有明确的根元素。最有效的方法是什么?
SAX解析器的问题是它们需要一个根元素,所以要么我要在数据流中添加一个伪元素(在Python中是否相当于Java的SequenceInputStream?)或者我要切换到非SAX一致的基于事件的解析器(是否有sgmllib的后继?)
数据的结构非常简单。基本上是元素列表:
<Document>
<docid>1</docid>
<text>foo</text>
</Document>
<Document>
<docid>2</docid>
<text>bar</text>
</Document>
*实际上要迭代
答案 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