我有一个很大的xml文件(大约84MB),格式如下:
<books>
<book>...</book>
....
<book>...</book>
</books>我的目标是提取每一本书并获取其属性。我尝试解析它(就像我对其他xml文件所做的那样),如下所示:
from xml.dom.minidom import parse, parseString
fd = "myfile.xml"
parser = parse(fd)
## other python code here但是代码似乎在parse指令中失败了。为什么会发生这种情况,我该如何解决?
我应该指出,该文件可能包含希腊语、西班牙语和阿拉伯语字符。
这是我在ipython中得到的输出:
In [2]: fd = "myfile.xml"
In [3]: parser = parse(fd)
Killed我想指出的是,计算机在执行过程中会冻结,因此这可能与内存消耗有关,如下所述。
发布于 2012-12-29 21:50:00
我强烈建议在这里使用SAX解析器。我不建议对超过几兆字节的任何XML文档使用minidom;我见过它在大约10MB的XML文档中使用大约400MB的内存读取。我怀疑你遇到的问题是由minidom请求太多内存引起的。
Python附带了一个XML SAX解析器。要使用它,请执行类似以下操作。
from xml.sax.handlers import ContentHandler
from xml.sax import parse
class MyContentHandler(ContentHandler):
# override various ContentHandler methods as needed...
handler = MyContentHandler()
parse("mydata.xml", handler)您的ContentHandler子类将覆盖ContentHandler中的各种方法(如startElement、startElementNS、endElement、endElementNS或characters。它们处理SAX解析器在读取XML文档时生成的事件。
与DOM相比,SAX是一种更“低级”的处理XML的方法;除了从文档中提取相关数据之外,ContentHandler还需要跟踪它当前所在的元素。但是,从好的方面来看,由于SAX解析器不会将整个文档保存在内存中,因此它们可以处理任何大小的XML文档,包括那些比您的文档大的文档。
我还没有尝试过在这种大小的XML文档上使用其他DOM解析器,比如lxml,但我怀疑lxml解析XML文档仍然需要相当长的时间和大量的内存。如果您每次运行代码时都必须等待它读入一个84MB的XML文档,这可能会减慢您的开发速度。
最后,我不相信你提到的希腊语、西班牙语和阿拉伯语字符会造成问题。
发布于 2012-12-29 21:09:03
尝试使用lxml,它更易于使用。
#!/usr/bin/env python
from lxml import etree
with open("myfile.xml") as fp:
tree = etree.parse(fp)
root = tree.getroot()
print root.tag
for book in root:
print book.text发布于 2012-12-29 21:03:49
有两种XML解析器(这适用于任何语言)。
、
一般来说,DOM比SAX更容易,因为很多复杂的细节都是由它的本机方法处理的。
SAX更具挑战性,因为您必须编写SAX解析在遍历XML文档期间“运行”的方法。
https://stackoverflow.com/questions/14081701
复制相似问题