Wann sollte ich SAX über StAX wählen?
Streaming-xml-Parser wie SAX und StAX sind schneller und mehr Speicher effizient als Parser bauen eine Baum-Struktur, wie DOM-Parser. SAX ist ein push-parser, was bedeutet, dass es eine Instanz des observer pattern (auch als listener pattern). SAX war es zunächst, doch dann kam der StAX - pull-parser, was bedeutet, dass es im Grunde funktioniert wie ein iterator.
Finden Sie Gründe, warum man lieber StAX über SAX überall, aber in der Regel läuft darauf hinaus: "es ist einfacher zu bedienen".
In der Java-tutorial auf JAXP, StAX ist vage dargestellt als in der Mitte zwischen DOM und SAX: "es ist einfacher, als SAX und effizienter als DOM". Aber, ich fand nie irgendwelche Hinweise, dass StAX wäre langsamere oder weniger effiziente Speicher als SAX.
All dies machte mich Wundern: gibt es irgendwelche Gründe für die Wahl von SAX statt StAX?
InformationsquelleAutor der Frage Rinke | 2011-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verallgemeinern ein bisschen, ich denke
StAX
werden können, so effizient wieSAX
. Mit der verbesserten Gestaltung vonStAX
ich kann nicht wirklich finden Sie jede situation, woSAX
- parsing bevorzugt, es sei denn, Sie arbeiten mit legacy code.BEARBEITEN: Laut diesem blog Java SAX vs. StAX
StAX
bieten keine schema-Validierung.InformationsquelleAutor der Antwort Johan Sjöberg
Überblick
XML-Dokumente sind hierarchisch Dokumente, in denen die gleichen element-Namen und namespaces auftreten, an mehreren stellen mit unterschiedlicher Bedeutung, und im Infinitiv Tiefe (rekursive). Als normal wird die Lösung der großen Probleme ist, teilen Sie Sie in kleinere Probleme. Im Rahmen der XML-Analyse verwendet, das heißt der Analyse bestimmter Teile von XML-Methoden spezifisch für die XML. Zum Beispiel, ein Stück von der Logik würde der parse-Adresse:
d.h. Sie hätten eine Methode
oder
irgendwo in Ihrer Logik, wobei XML-Eingänge Argumente und zurückgeben eines Objekts (Ergebnis von B kann der Wert aus einem Feld später).
SAX
SAX 'schiebt' XML Veranstaltungenes bleibt Ihnen überlassen, zu bestimmen, wo die XML-Ereignisse gehören, die in Ihrem Programm /Daten.
Im Falle eines 'Gebäudes' start-element, würden Sie brauchen, um festzustellen, dass Sie eigentlich in der Analyse einer Adresse und dann auf der route der XML-Ereignis die Methode, deren Aufgabe es ist, zu interpretieren Adresse.
StAX
StAX 'zieht' XML Veranstaltungenes bleibt Ihnen überlassen, zu bestimmen, wo in Ihrem Programm /Daten zu erhalten, die XML-Ereignisse.
Natürlich, Sie würden immer wollen, um zu erhalten eine "Aufbau" - event in der Methode, deren Aufgabe es ist, zu interpretieren-Adresse.
Diskussion
Der Unterschied zwischen SAX und StAX ist, dass der push-und pull. In beiden Fällen wird der parse-Staat behandelt werden müssen, irgendwie.
Bedeutet dies eine Methode B, die als typisch für SAX, und Eine Methode für StAX. Darüber hinaus SAX geben müssen, B einzelne XML-Ereignisse, während der StAX kann Eine mehrere Ereignisse (durch ein XMLStreamReader Instanz).
Damit B prüfen Sie zunächst den vorherigen Zustand des Parsen und dann mit jedem einzelnen XML-Ereignis und speichert dann den Zustand (in einem Feld). Methode A kann nur verarbeiten der XML-Ereignisse, die alle auf einmal durch den Zugriff auf die XMLStreamReader mehrere Male, bis zufrieden.
Fazit
StAX können Sie Ihre Struktur analysieren (data-binding) - code entsprechend der XML-Struktur; so in Bezug auf SAX, der 'Staat' ist implizit aus den Programm-Ablauf für StAX, in der Erwägung, dass im SAX, der Sie immer schützen zu müssen, eine Art state-variable + route dem Fluss nach, der Staat, für die meisten-event ruft.
Empfehle ich StAX für alle aber die einfachsten Dokumente. Vielmehr bewegen SAX als eine Optimierung später (aber Sie werden wahrscheinlich wollen zu gehen, Binär).
Folgen diesem Muster, wenn das Parsen mit StAX:
Also die submethod verwendet, etwa der gleiche Ansatz, D. H. das zählen level:
Und dann schließlich werden Sie eine Stufe erreichen, in dem Sie Lesen werden, die Basis-Typen.
Dies ist Recht einfach und es gibt keinen Raum für Missverständnisse. Denken Sie daran, zu verringern Lautstärke korrekt:
A. nachdem Sie erwarteten Zeichen bekam aber eine END_ELEMENT in einigen tag enthalten chars (in dem obigen Muster):
wurde statt
Gleiches gilt für eine fehlende Teilstruktur zu, Sie bekommen die Idee.
B. nach dem Aufruf subparsing Methoden, die aufgerufen werden, auf start-Elemente, und kehrt NACH dem entsprechenden end-element, D. H. der parser ist auf einem Niveau niedriger als vor dem Aufruf der Methode (dem obigen Muster).
Hinweis, wie dieser Ansatz völlig ignoriert 'ignorable' whitespace zu, für mehr und robuste Implementierung.
Parser
Gehen Sie mit Woodstox für die meisten Funktionen oder Aaalto-xml für die Geschwindigkeit.
InformationsquelleAutor der Antwort
@Rinke: ich denke, nur die Zeit, ich denke, lieber SAX über STAX in dem Fall, wenn Sie nicht brauchen, um zu verarbeiten/verarbeiten von XML-Inhalten; für z.B. die einzige Sache, die Sie tun möchten, ist überprüfen der Wohlgeformtheit von eingehenden XML-Daten und wollen einfach nur, um Fehler zu behandeln, wenn es hat...in diesem Fall können Sie rufen Sie einfach die parse () - Methode auf SAX-parser und geben Sie Fehlerbehandlung zu behandeln parsing-problem....also im Grunde STAX ist definitiv vorzuziehen Wahl in Szenarien, in denen Sie behandeln möchten Inhalt becasue SAX content-handler ist zu schwierig zu Programmieren...
einem Beispiel aus der Praxis Fall sein kann, wenn Sie Reihe von SOAP-Knoten in Ihrem enterprise-system und eine entry-level-SOAP-Knoten können nur diejenigen, die SOAP-XML-pass-thru nächste Stufe, die Wohlgeformtheit, dann sehe ich keinen Grund, warum ich verwenden würde, STAX. Ich würde halt SAX.
InformationsquelleAutor der Antwort ag112
Es ist alles ein Gleichgewicht.
Können Sie wiederum einen SAX-parser in ein pull-parser mit Hilfe einer Warteschlange blockiert und einige Tricks thread so, für mich gibt es viel weniger Unterschied ist, als es zunächst scheint.
Glaube ich derzeit StAX muss gepackt werden, die durch einen Drittanbieter-jar-während SAX kommt frei in javax.
Ich vor kurzem beschlossen SAX und baute ein pull-parser um ihn herum, damit ich nicht angewiesen auf Drittanbieter-jar.
Zukünftigen Java-Versionen werden mit ziemlicher Sicherheit enthalten ein StAX-Implementierung, so dass das problem verschwindet.
InformationsquelleAutor der Antwort OldCurmudgeon
StAX können Sie erstellen eine bidirektionale XML-Parser sind schnell. Es erweist sich als eine bessere alternative zu anderen Methoden, wie DOM und SAX, sowohl im Hinblick auf performance und usability
Lesen Sie mehr über StAX in Java-StAX-Tutorials
InformationsquelleAutor der Antwort Annamalai Thangaraj
Meisten der zur Verfügung gestellten Informationen diese Antworten sind etwas veraltet... es wurde eine umfassende Studie aller XML-parsing-libraries in das Jahr 2013 research paper... Lesen Sie es und Sie werden leicht sehen, der klare Sieger (Tipp: es gibt nur einen wahren Gewinner)...
http://recipp.ipp.pt/bitstream/10400.22/1847/1/ART_BrunoOliveira_2013.pdf
InformationsquelleAutor der Antwort vtd-xml-author