Hier ist noch der light-weight Ansatz mit SAX, der sich im Fall meines riesigen Datenbankabzuges als einzig anwendbar herausgestellt hat, weil etree zu RAM- und übrigens auch CPU-lastig ist (siehe Thread zum Splitten von großen XML-Quelldateien):
import xml.sax
class MARC21Handler(xml.sax.ContentHandler):
def __init__(self):
self.in_record = False
self.identifier = None
self.outfile = open('output.xml', 'w')
def startElement(self, name, attrs):
if name == 'record':
self.in_record = True
self.identifier = attrs.get('identifier')
self.outfile.write('<record identifier="%s" status="%s" level="%s">' % (attrs.get('identifier'), attrs.get('status'), attrs.get('level')))
def characters(self, content):
self.outfile.write(content)
def endElement(self, name):
if name == 'record':
self.outfile.write('<controlfield tag="001">%s</controlfield>\n</record>' % self.identifier)
self.in_record = False
elif name == 'datafield':
self.outfile.write('</datafield>')
elif name == 'subfield':
self.outfile.write('</subfield>')
def startDocument(self):
self.outfile.write('<?xml version="1.0" encoding="UTF-8"?>\n')
self.outfile.write('<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="abc.xsd">')
def endDocument(self):
self.outfile.write('</collection>\n')
self.outfile.close()
if __name__ == '__main__':
parser = xml.sax.make_parser()
parser.setContentHandler(MARC21Handler())
parser.parse('input.xml')
(Prompted mit llama-3-70b-instruct, angepasst von mir)
Ist diesmal in OOP Python gehalten, weil LLaMA scheinbar hier ein Fable dafür hatte Resultat ist das selbe wie oben. Bei den Feldinhalten am besten noch darauf achten, ob nach dem Prozess Sonderzeichen korrekt umgesetzt wurden. Der Durchlauf mit meinem sehr großen Datenbankabzug hat mit SAX nur 3min gedauert