Gibt es einen XPath-Prozessor für das SAX-Modell?
Ich bin auf der Suche nach eine XPath-evaluator, der nicht neu erstellen die gesamte DOM-Dokument zu suchen, die Knoten eines Dokuments: eigentlich das Objekt ist für die Verwaltung einer großen Menge von XML-Daten (im Idealfall über 2 GB) mit SAX-Modell, das ist sehr gut für die Verwaltung des Speichers, und geben die Möglichkeit zur Suche von Knoten.
Danke an Euch alle für die Unterstützung!
Für alle diejenigen, die sagen, es ist nicht möglich: ich habe vor kurzem, nach der die Frage gestellt hat, fand ein Projekt mit dem Namen "saxpath" (http://www.saxpath.org/), aber ich finde keine Umsetzung Projekt.
InformationsquelleAutor der Frage user189603 | 2009-12-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine aktuelle Liste (zusammengestellt von web-Suchergebnisse und die anderen Antworten):
Den nächsten Schritt verwenden Sie die Beispiele von XMLDog und vergleichen Sie die Leistung all dieser Ansätze. Dann werden die Testfälle sollten erweitert werden, um die unterstützten XPath-Ausdrücke.
InformationsquelleAutor der Antwort
Wir regelmäßig analysieren 1GB+ komplexe XML-Dateien mit einem SAX-parser, die Extrakte teilweise DOM-Bäume, die sich bequem abgefragt, die Verwendung von XPath. Ich gebloggt hier: http://softwareengineeringcorner.blogspot.com/2012/01/conveniently-processing-large-xml-files.html - Quellen sind verfügbar auf github - MIT-Lizenz.
InformationsquelleAutor der Antwort Andreas Haufler
XPath funktioniert mit SAX, und die meisten XSLT-Prozessoren (insbesondere Saxon und Apache Xalan) unterstützen die Ausführung von XPath-Ausdrücken innerhalb XSLTs auf einen SAX-stream ohne den Aufbau der gesamten dom.
Den Sie verwalten, um dies zu tun, sehr grob gesagt, wie folgt :
Wie diese Puffer ist es auch sehr interessant, denn während einige einfach zu erstellen-DOM-Fragmente hier und da, andere benutzen sehr optimiert Tabellen für schnelles nachschlagen und reduziert den Speicherverbrauch.
Wie viel Sie verwalten, zu optimieren, hängt weitgehend von der Art von XPath-Abfragen, die Sie finden. Wie bereits geschrieben sächsischen Dokumentation klar erklären, Abfragen, verschieben, "bis" und dann queren, "horizontal" (Geschwister von Geschwister) das Dokument setzt natürlich auch Voraus, das gesamte Dokument zu sein, aber die meisten von Ihnen erfordern nur ein paar Knoten gehalten werden, in den RAM, in jedem moment.
Ich bin mir ziemlich sicher, dass dies, weil, als ich noch jeden Tag webapp mit Cocoon, hatten wir die XSLT-Speicherbedarf problem jedes mal, wenn wir ein "//etwas" Ausdruck innerhalb eines XSLT-und ganz oft mussten wir Nacharbeiten XPath-Ausdrücke, die es erlauben, ein besseres SAX-Optimierung.
InformationsquelleAutor der Antwort Simone Gianni
SAX ist nur vorwärts, während XPath-Abfragen im Dokument navigieren können in jede Richtung (man denke
parent::
ancestor::
preceding::
undpreceding-sibling::
Achse). Ich sehe nicht, wie das möglich wäre, im Allgemeinen. Die beste Annäherung wäre eine Art lazy loading-DOM, aber je nach Ihren Abfragen, dies kann oder kann nicht geben Ihnen einen Vorteil - es gibt immer ein worst-case-Abfrage so, als//*[. != preceding::*]
.InformationsquelleAutor der Antwort Pavel Minaev
Sorry, eine etwas späte Antwort hier, es scheint, dass dies möglich ist für eine Teilmenge der XPath - im Allgemeinen ist es sehr schwierig, aufgrund der Tatsache, dass XPath entsprechen können sowohl vorwärts als auch rückwärts aus der "aktuellen" Punkt. Ich bin mir bewusst, von zwei Projekten, die zu lösen es bis zu einem gewissen Grad die Verwendung von state machines: http://spex.sourceforge.net & http://www.cs.umd.edu/projects/xsq. Ich habe nicht geschaut bei Ihnen im detail, aber Sie scheinen einen ähnlichen Ansatz.
InformationsquelleAutor der Antwort Colin
Ich werde werfen in einem Stecker für ein neues Projekt von mir, namens AXS. Es ist an https://code.google.com/p/annotation-xpath-sax/ und die Idee ist, dass Sie kommentieren Methoden (vorwärts-Achse-nur) XPath
Aussagen und Sie bekommen aufgerufen, wenn der SAX-parser ist in einem Knoten, die es entspricht. Also mit einem Dokument
können Sie Dinge tun, wie
oder
oder
Natürlich, die Bibliothek ist so neu, dass ich noch nicht einmal ein release noch, aber es ist MIT lizenziert, so fühlen sich frei, es zu versuchen und sehen, ob es passt Ihre braucht. (Ich schrieb es auf
HTML screen scraping mit der niedrig genug ist, Speicheranforderungen, dass ich es auf
alte Android-Geräte...), Wenn Sie Fehler finden, bitte lassen Sie mich wissen, indem er Sie auf die
googlecode-Seite!
InformationsquelleAutor der Antwort bks
Sorry für die späte Antwort, aber ich habe Implementierung eines einfache XPath-Ausdruck Pfad für den SAX-Parser. Es unterstützt nur den tag, Attribut optional mit dem Wert und den index aufgrund von SAX-forward-Natur. Ich machte eine delegate Handler für die Bewertung der gegebenen Ausdruck, wenn der Handler implementiert ExpressionFilter. Obwohl diese Klassen sind eingebettet in das Projekt, sollte es nicht schwer sein, zu extrahieren.
Mehr Informationen
Beispiele - Finden Sie in Klassen mit der
HandlerHtml
PräfixInformationsquelleAutor der Antwort Kyle Kroboth
Gibt es SAX/StAX-basiert XPath-Implementierungen, aber Sie unterstützen nur eine kleine Teilmenge von XPath-Ausdrücken/Achse weitgehend durch SAX/StAX ist vorn nur die Natur.. die beste alternative, die ich mir bewusst bin verlängert VTD-XMLes unterstützt die vollständige xpath -, Teil-Dokument laden per mem-Karte.. und einer maximalen Dokumentgröße von 256 GB, aber Sie müssen die 64-bit-JVM zu verwenden, um sein volles Potenzial
InformationsquelleAutor der Antwort vtd-xml-author
Was Sie tun könnten, ist hook ein XSL-Transformator eine SAX-input-Quelle. Ihre Verarbeitung erfolgt sequentiell und die XSL-Präprozessor werde den Versuch machen, fangen Sie den Eingang, wie es kommt, wenn man es in was auch immer das Ergebnis, das Sie angegeben haben. Sie können diese verwenden, um ziehen Sie einen Pfad den Wert aus dem stream. Dies würde in besonders praktisch, wenn Sie wollten, um zu produzieren eine Reihe von verschiedenen XPATH-Ergebnisse in einem Durchgang.
Erhalten Sie (in der Regel) ein XML-Dokument als Ergebnis, aber Sie können ziehen Sie Ihre erwartete Ausgabe von, sagen wir, ein
StreamResult
mit nicht allzu viel Aufwand.InformationsquelleAutor der Antwort Carl Smotricz
Haben Sie einen Blick auf die streaming-Modus von Saxon-SA XSLT-Prozessor.
http://www.saxonica.com/documentation/sourcedocs/serial.html
"Die Regeln, die bestimmen, ob ein Pfad-Ausdruck gestreamt werden kann sind:
Gibt der path-Ausdruck eingeführt, durch den Aufruf auf doc() oder ein Dokument entsprechen muss, um eine Teilmenge von XPath wie folgt definiert:
jeder XPath-Ausdruck wird akzeptiert, wenn es entspricht den Regeln für path-Ausdrücke erscheinen in identity constraints in XML-Schema. Diese Regeln erlauben keine Prädikate; der erste Schritt (aber nur der erste) können eingeführt werden mit "//"; der Letzte Schritt kann Optional die attribute-Achse, alle anderen Schritte müssen einfach sein, die Achse Schritte unter Verwendung der child-Achse.
Muss der Ausdruck wählen Sie entweder Elemente oder Attribute nur oder eine Mischung der Elemente und Attribute.
Einfache Filter (eine oder mehrere) werden ebenfalls unterstützt. Jeder filter kann beantragen, den letzten Schritt oder der Ausdruck als ganzes, und es darf nur nach unten Auswahl aus dem Kontext-Knoten (self, child, attribute, descendant, descendant-or-self -, oder namespace-Achse). Es muss nicht positional (das heißt, es muss nicht Referenz-position() oder last(), und muss nicht numerisch sein: in der Tat, es muss so sein, dass die sächsischen bestimmen kann zur compile-Zeit, nicht numerisch). Filter können angewendet werden, um die Gewerkschaften oder die Zweigstellen der Gewerkschaften. Jeder Verstoß gegen diese Bedingungen bewirkt, dass der Ausdruck, der ausgewertet werden, ohne dass die streaming-Optimierung.
Diese Regeln gelten nach dem anderen-Optimierung umschreibt die angewendet wurden, zum Ausdruck. Zum Beispiel, einige FLWOR-Ausdrücke können geschrieben werden, um einen XPath-Ausdruck, entspricht diesen Regeln.
Optimierung ist nur aktiviert, wenn diese explizit angefordert werden, entweder mit der sächsischen:stream () - Erweiterung-Funktion, oder die Sächsische:lese-mal-Attribut auf anXSLT xsl:copy-Anweisungen oder XQuery-pragma-sächsischen: - stream. Es ist nur verfügbar, wenn das stylesheet bzw. die Abfrage verarbeitet mit Saxon-SA."
Hinweis: Es ist wahrscheinlich in der kommerziellen version diese Möglichkeit zur Verfügung steht. Ich habe verwendet sächsischen ausführlich erwähnt, und es ist ein schönes Stück Arbeit.
InformationsquelleAutor der Antwort Thorbjørn Ravn Andersen
Mmh ich weiß nicht, ob ich wirklich verstehe Sie. Soweit ich weiß, das SAX-Modell ist event-orientiert. Das bedeutet, Sie tun etwas, wenn ein bestimmter Knoten angetroffen wird, während der Analyse. Ja, es ist besser für Speicher, aber ich sehe nicht, wie Sie möchten, um XPath-in. Da SAX nicht ein Modell bauen, ich glaube nicht, dass das möglich ist.
InformationsquelleAutor der Antwort Felix Kling
Standard javax xpath-API-technisch schon funktioniert mit streams;
javax.xml.xpath.XPathExpression
ausgewertet werden können gegen eineInputSource
die wiederum aufgebaut werden kann, mit einemReader
. Ich glaube nicht, dass es baut einen DOM unter der Decke.InformationsquelleAutor der Antwort skaffman
Haben Sie versucht, auch QuiXPath https://code.google.com/p/quixpath/ ?
InformationsquelleAutor der Antwort innovimax
Ich glaube nicht, dass xpath arbeitet mit SAX, aber Sie könnte nehmen Sie einen Blick auf StAX, die ein erweitertes streaming-XML-API für Java.
http://en.wikipedia.org/wiki/StAX
InformationsquelleAutor der Antwort ptriller