Ich versuche, alle project1
Knoten (zusammen mit ihren untergeordneten Elementen) aus dem unten Beispiel XML-Dokument (Originaldokument ist etwa 30 GB) mit SAX-Parser.Es wäre in Ordnung, eine separate geänderte Datei oder ok mit der Inline-Bearbeitung.Wie verwende ich xml sax parser zum Lesen und Schreiben eines großen 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>
Hier ist mein Versuch ..
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")
Ich kann es nicht machen zu arbeiten.
Was ist ein Problem, Daten als Text zu verarbeiten? Einfach: Flagge prüfen, ist es unten, Grifflinie, ist es project1, Fahne anheben, schreiben/anfügen oder nicht, Wiederholung ... Nur ein Entwurf der Strategie – ar7max
Aber diese Annäherung resultiert in das Laden der ganzen Akte in Gedächtnis. –
Ich meine: Zeile lesen - Prozesslinie - Status aktualisieren - Entscheidung schreiben oder nicht. Arbeiten Sie nicht mit ganzen Dateien gleichzeitig. Es besteht kein Bedarf. – ar7max