我试图使用SAX解析器从下面的示例xml文档(原始文档大约30 GB)中删除所有project1
节点(以及它们的子元素)。可以使用单独的修改文件或确定在线编辑。如何使用xml sax解析器读取和写入大型xml?
sample.xml
<ROOT>
<test src="http://dfs.com">Hi</test>
<project1>This is old data<foo></foo></project1>
<bar>
<project1>ty</project1>
<foo></foo>
</bar>
</ROOT>
这里是我的尝试..
parser.py
from xml.sax.handler import ContentHandler
import xml.sax
class MyHandler(xml.sax.handler.ContentHandler):
def __init__(self, out_file):
self._charBuffer = []
self._result = []
self._out = open(out_file, 'w')
def _createElement(self, name, attrs):
attributes = attrs.items()
if attributes:
out = ''
for key, value in attributes:
out += ' {}={}'.format(key, value)
return '<{}{}>'.format(name, out)
return '<{}>'.format(name)
def _getCharacterData(self):
data = ''.join(self._charBuffer).strip()
self._charBuffer = []
self._out.write(data.strip()) #remove strip() if whitespace is important
def parse(self, f):
xml.sax.parse(f, self)
def characters(self, data):
self._charBuffer.append(data)
def startElement(self, name, attrs):
if not name == 'project1':
self._result.append({})
self._out.write(self._createElement(name, attrs))
def endElement(self, name):
if not name == 'project1': self._result[-1][name] = self._getCharacterData()
MyHandler('out.xml').parse("sample.xml")
我不能让它工作。
将文本作为文本进行处理时会出现什么问题?简单地说:检查标志,是否下降,抓线,是project1,提高标志,写/附加与否,重复...只是策略纲要 – ar7max
但是这种方法会导致将整个文件加载到内存中。 –
我的意思是:读取行 - 进程行 - 更新状态 - 决定是否写入。不要一次处理整个文件。没有必要。 – ar7max