Kann der SAX-Parser XPath in Java?
Ich versuche zu migrieren einer meiner Klassen, die verwendet DOM
parsing mit viel XPath
Ausdrücken SAX
analysieren. DOM
Analyse war gut für mich, aber einige der Dateien, die ich versuche zu analysieren, sind zu groß und führen dazu, dass server-timeouts. Ich wiederverwenden wollen XPath
mit der SAX
analysieren, aber ich bin mir nicht sicher, ob es möglich ist, und wenn nicht möglich, könnten Sie mir bitte helfen weil ich habe keine Ahnung, wie der folgende code wird, wenn ich nur SAX
:
Document doc = bpsXml.getDocument();
String supplierName = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/Party[@stdValue='SU']/Name/Name1");
String language = BPSXMLUtils.getXpathString(doc, "/Invoice/InvoiceHeader/InvoiceLanguage/@stdValue");
Warten Sie, warum sind Sie die Umstellung von DOM mit XPath SAX? Wenn es ist, weil du immer die Dateien aus dem Netz und die server zu lange dauert, die Datei zu senden, dann ändern, wie Sie sind, bekommen Sie die Datei, nicht wie Sie sind analysiert.
Dort ist auch das Verwandte SO ein post. Einige der Antworten beziehen sich auf tools und APIs, die verwendet werden können.
Dort ist auch das Verwandte SO ein post. Einige der Antworten beziehen sich auf tools und APIs, die verwendet werden können.
InformationsquelleAutor Nikola Dichev | 2012-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach mit einem SAX-parser bauen nicht eine Darstellung des XML-Baum im Speicher (das ist, warum SAX-mehr Speicher-effizient). Es wird nur auslösen, "Ereignisse", wenn ein neues XML-element gefunden wird. Sie müssen halten Sie den Rahmen (oft ein Stapel von übergeordneten Elemente) im Speicher zu "wissen", wo Sie in den Baum.
Weil Sie nicht haben, einen Baum im Speicher, werden Sie nicht in der Lage sein zu verwenden XPath. Sie können nur testen, für den aktuellen "Kontext" (Ihre manuallay verwalteten stack) zur Abfrage Ihres Dokuments.Denken Sie daran, dass der SAX-parser nur ein Lauf auf Ihre Datei, so dass, um in der Datei ist wichtig.
Glücklicherweise gibt es andere Ansatz wie VTD-XML das ist eine Bibliothek, die den Aufbau der XML-Baum im Speicher, sondern nur die Struktur ist, es nicht extrahieren Sie die tatsächlichen Inhalt der Datei, der Inhalt wird extrahiert Bedarf. Es ist viel mehr Speicher effizient als ein DOM-parser, während immer noch eine XPath. Ich personnaly Verwendung dieser Bibliothek zu arbeiten, zu analysieren, ~700 MB große XML-Dateien mit XPath (ja das ist verrückt, aber es funktioniert und ist sehr schnell.)
Nach all diesen Jahren, habe ich parse 2GB+ - Dateien mit VTD-XML. Es hat einen sehr guten job und Speicher ist nicht ein Problem überhaupt. Haben Sie versuchen Sie es und eine schlechte Erfahrung hatte? Können Sie uns mehr Informationen?
Wie viel Speicher (-Xmx) haben, die Sie zuordnen, um die parsing-Programm ?
Die meisten meiner Analyse arbeitete mit den Standard-Xmx (64 MB), aber ich hatte manchmal schieben Sie es bis zu 1GB nur für die Sicherheit (aus der Erinnerung, ich arbeite nicht mehr auf diese Themen).
InformationsquelleAutor Vincent Robert
IMHO die einfachste Möglichkeit zur Verarbeitung von XML ist die Verwendung StAX, die Streaming API for XML. Es vereint die Vorteile von DOM-und SAX (und bietet eine einfachere migration zu Ihnen). Haben Sie immer noch ein cursor auf ein XML-element (wie beim SAX), aber dein code verschiebt den cursor vorwärts. Dies bietet den großen Vorteil, dass die XML-Verarbeitung code sehr viel besser lesbar. Es löst auch das Speicher-Problem als nur das aktuelle XML-element gehalten werden, in den Speicher. Hier ist auch ein schöner tutorial.
Um auch die Antwort auf Ihre ursprüngliche Frage: Eine kurze Suche bei Google hat mir gezeigt, es gibt keinen einfachen, allgemein akzeptierten Art und Weise, die wahrscheinlich bedeutet, dass alle benutzerdefinierten Lösungen sind nicht stabil, nicht gepflegt und nicht gut getestet werden.
InformationsquelleAutor r3nj1
Wechsel zu SAX-parsing (oder StAX) erfordert eine vollständige änderung in Ihrem Ansatz. Es sieht so aus als wenn Sie noch nicht voll zu schätzen, wie viel Arbeit es sein wird. Für jeden Rat, um Sinn zu machen, müssen wir wissen, wie groß die Datei ist, und welche Art der Verarbeitung Sie wollen mit den Daten machen. Wenn Sie die Daten filtern, zum Beispiel, dann wird eine XQuery-Umsetzung verwendet Dokument-Projektion könnte eine gute Antwort (diese wird automatisch SAX hinter die kulissen zu bauen, einen Baum enthält nur die Teilmenge der Daten, die Sie tatsächlich interessiert).
InformationsquelleAutor Michael Kay