Seite 1 von 1

lxml iterparse: root element zu Beginn ausgeben

Verfasst: Samstag 14. November 2015, 13:27
von nezzcarth
Hallo :)

Aktuell versuche ich größere XML-Dateien zu verarbeiten. Die Dateien bestehen aus einem Rootelement und zig Datensätzen; ich möchte im Prinzip Datensätze, die bestimmte Kriterien erfüllen auslesen und den Rest verwerfen. Dazu verwende ich lxml.etree.iterparse, um die Datensätze nacheinander einzulesen. Passende Datensätze werden in eine gemeinsame Ausgabedatei geschrieben. Anschließend wird jeder Datensatz so gut es geht aus dem Speicher entfernt. Mein Problem ist nun, dass ich zur Zeit überlege, wie ich am geschicktesten an das Root-Element komme, um es am Anfang und am Ende mit in die Datei zu schreiben.
Zwar kann ich iterparse sagen, dass ich jeweils auch über jedes Start-Ereignis iterieren möchte, aber das erscheint mir für ein einziges Element etwas viel Overhead zu sein; man kann den Iterator ja auch nicht im Betrieb umschalten ("ab jetzt nur noch end-tags")...

Ich nehme an, dass das strukturell eine Aufgabenstellung ist, die häufiger vorkommt. Daher wollte ich mal fragen, wie man so etwas generell angehen würde.

Vielen Dank schon mal

Re: lxml iterparse: root element zu Beginn ausgeben

Verfasst: Samstag 14. November 2015, 13:47
von BlackJack
@nezzcarth: Ich würde erstmal auch Start-Tags verarbeiten und mal messen was für einen Zeitunterschied das tatsächlich macht. Und falls das dann wirklich ein Problem sein sollte und es hier ja um das Wurzelelement geht, könnte man vielleicht auch einfach zweimal parsen, einmal mit Start-Tags und gleich beim Wurzelelement abbrechen, und dann das was Du bisher machst für die Datensätze mit End-Tags.

Re: lxml iterparse: root element zu Beginn ausgeben

Verfasst: Samstag 14. November 2015, 15:59
von nezzcarth
@BlackJack: Danke für deine Hinweise :) Ich dachte, dass ich vielleicht einen prinzipiellen Fehler mache, aber dann werd' ich das einfach mal messen. (Aktuell behelfe ich mir als Notlösung damit, das nachträglich per mit head/cat/tail einzufügen)

Re: lxml iterparse: root element zu Beginn ausgeben

Verfasst: Montag 16. November 2015, 20:49
von nezzcarth
BlackJack hat geschrieben:@nezzcarth: Ich würde erstmal auch Start-Tags verarbeiten und mal messen was für einen Zeitunterschied das tatsächlich macht.
Das hab ich nun mal gemacht. Die Variante mit den Start-Tags braucht etwa die 1.5-fache Zeit (was in dem Bereich, in dem ich mit bewege, zugegeben schlimmer klingt, als es ist). Der Grund könnte sein, dass ich in der Ausgangsversion nur über die End-Tags von Datensätzen iteriere. In der Variante mit Start-Tags ist der Tag-Parameter (bei mir?) allerdings nicht möglich, sodass ich für jedes Tag im Dokument eine if-Abfrage habe, was sich wohl aufsummiert.