Parsing sehr großer XML-Dokumente (und ein bisschen mehr) in Java
(Alle folgenden werden in Java geschrieben)
Habe ich eine Anwendung erstellen, die als input-XML-Dokumente, die potentiell sehr groß. Das Dokument wird verschlüsselt-nicht mit XMLsec, aber mit meinen Klienten die bereits vorhandenen Verschlüsselungs-Algorithmus --, erfolgt in drei Phasen:
Erste, der stream wird entschlüsselt werden, die nach dem oben genannten Algorithmus.
Zweite, eine Erweiterung der Klasse (geschrieben von einer Dritten Partei, um eine API-ich bin providing) liest einen gewissen Teil der Datei. Die Menge, die gelesen wird, ist nicht vorhersehbar-insbesondere ist es nicht garantiert, dass in der Kopfzeile der Datei, sondern kann jederzeit auftreten, die in der XML.
Zuletzt ein weiteres extension-Klasse (gleiche Menge) unterteilen des Eingabe-XML-in 1..n Teilmenge von Dokumenten. Es ist möglich, dass diese in einigen teilen überlappen, die Teil des Dokuments behandelt die zweite operation, das heißt: ich glaube, ich muss Zurückspulen, was Mus ich benutze, um den Umgang mit diesem Objekt.
Hier meine Frage:
Gibt es eine Möglichkeit, dies zu tun, ohne jemals zu Lesen das ganze Stück von Daten in den Speicher zu einer Zeit? Natürlich kann ich implementieren, die Entschlüsselung als input stream filter, aber ich bin mir nicht sicher, ob es möglich ist, analysieren von XML in der Weise, die ich bin zu beschreiben; indem Sie gehen über, wie viel von dem Dokument ist erforderlich, um zu sammeln, im zweiten Schritt die Informationen, und dann durch Zurückspulen des Dokuments und überfahren es wieder eine Unterteilung in Arbeitsplätze, im Idealfall die Freigabe alle Teile des Dokuments, die nicht mehr in Gebrauch, nachdem Sie verabschiedet worden.
InformationsquelleAutor der Frage Chris R | 2008-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stax ist der richtige Weg. Ich würde empfehlen, sich auf Woodstox
InformationsquelleAutor der Antwort mzehrer
Dies klingt wie ein job für StAX (JSR 173). StAX ist ein pull-parser, was bedeutet, dass es funktioniert mehr oder weniger wie eine event-basierte parser wie SAX, aber das haben Sie mehr Kontrolle darüber, Wann Sie aufhören zu Lesen, die Elemente zu ziehen, ...
Die Benutzerfreundlichkeit dieser Lösung hängt viel von dem, was Ihre extension-Klassen eigentlich machen, wenn Sie Kontrolle über Ihre Umsetzung, etc...
Der wichtigste Punkt ist, dass, wenn das Dokument sehr groß ist, werden Sie wahrscheinlich wollen, um eine event-basierte parser und nicht ein Baum basiert, so dass Sie nicht verwenden eine Menge Speicher.
Implementierungen von StAX kann man von SONNE (SJSXP), Codehaus oder ein paar andere Anbieter.
InformationsquelleAutor der Antwort Guillaume
Könnte man eine
BufferedInputStream
mit einem sehr großen Puffer Größe und Nutzungmark()
vor der Endung-Klasse arbeitet und diereset()
danach.Wenn die Teile der extension-Klasse braucht, ist sehr weit in der Datei, dann könnte dies sehr Speicher-intensiv,", obwohl.
Eine allgemeinere Lösung wäre, ein eigenes zu schreiben
BufferedInputStream
-workalike, dass Puffer auf die Festplatte, wenn die Daten, die gepuffert werden, übersteigt eine voreingestellte Schwelle.InformationsquelleAutor der Antwort Joachim Sauer
Ich würde schreiben Sie eine benutzerdefinierte Implementierung der
InputStream
dass entschlüsselt die bytes in die Datei, und verwenden Sie dann SAXdie zum analysieren der resultierenden XML, wie es kommt aus dem stream.InformationsquelleAutor der Antwort Nick Holt
Könnten Sie interessieren XOM:
InformationsquelleAutor der Antwort PhiLho
Blick auf die XOM Bibliothek. Das Beispiel, das Sie suchen, ist
StreamingExampleExtractor.java
im samples-Verzeichnis der source-distribution. Dies zeigt eine Technik zum durchführen einer streaming-analysieren von großen xml-Dokumenten nur Gebäude bestimmte Knoten, Verarbeitung und Entsorgung. Es ist sehr ähnlich zu einem sax-Ansatz, sondern hat eine Menge mehr parsing-Fähigkeit integriert, so dass ein streaming-Analyse kann erreicht werden, ziemlich leicht.Wenn Sie arbeiten möchten, auf einer höheren Ebene betrachten NUX. Dies bietet ein hohes Maß streaming xpath-API, liest nur die Menge der Daten in den Speicher benötigt, um das zu bewerten xpath.
InformationsquelleAutor der Antwort NickV