XML und pyMARC: Extraktion des Record Identifiers

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 :sweat_smile: 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 :+1: