我試圖使用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