2009-08-25 9 views
1

Ich habe eine relativ allgemeine Frage in Bezug auf SAX. Ich verstehe, wie es funktioniert, und basierend auf Tutorials, die ich gelesen habe, habe ich gelernt, den Zustand zu halten, indem eine Tonne von Datenelementen wie inNode, die Boolean sind und dann in jedem Event-Handler jeden boolean überprüfen und die Parameter entsprechend behandeln .SAX Code Effizienz

Für mich scheint dies wirklich ineffizient, gibt es einen effizienteren Weg oder ist das nur die Natur von SAX?

Danke, Chris

+0

versuchen http://code.google.com/p/jlibs/wiki/SAX2JavaBinding –

Antwort

2

Oft können Sie den Status beibehalten, indem Sie einen einfachen Stapel von Tags haben.

Wenn Sie einen Knoten eingeben, drücken Sie.

Wenn Sie einen Knoten verlassen, Pop.

Manchmal ist dies besser als eine Menge Booleans. Stattdessen untersuchen Sie den Stapel, um festzustellen, ob der richtige Kontext vorhanden ist, um die analysierten Daten zu erhalten.

+0

Ah, das ist wirklich kreativ. Ich denke, dass es den Code auch viel sauberer machen würde, obwohl Sie wahrscheinlich immer noch ein paar if/else Blöcke haben müssten, oder? Es sei denn, Sie wurden wirklich kreativ und hatten eine Art Handler-Architektur, die in einer Hash-Map mit dem Schlüssel als Knotenname gespeichert wurde. –

+0

Selten haben Sie einen "Haufen" von if/else-Blöcken. Normalerweise erstellen Sie einen XPath-ähnlichen Abgleich des aktuellen Kontexts, um festzustellen, ob Sie ihn beibehalten möchten. Da der Kontext ein Stack ist (eine Liste in Python), ist der Vergleich trivial. In anderen Sprachen ist der Vergleich eines Stapels mit einem Vorlagenmuster möglicherweise etwas schwierig, aber es ist mehr regulärer Ausdruck oder XPath-Vergleich als alles andere. –

+0

Es ist immer besser als ein Haufen Booleans - eigentlich kann ich mir nicht vorstellen, SAX ohne einen Stapel zu verwenden. –

0

Dies ist, wie SAX funktioniert. Es wurde für geringe Speicherauslastung und einfachere Verarbeitung entwickelt. Wenn Ihr Code zu komplex wird, möchten Sie möglicherweise stattdessen das DOM-Modell verwenden.

+0

Fair genug, danke! –

+0

Eine andere Option, die effizienter als DOM oder SAX ist, ist VTD-XML –