SAX und (J)DOM verbinden

LostBoi

Grünschnabel
Hallo zusammen.

Kurz eine Schilderung meines Vorhabens:

Ich habe eine unbekannte Anzahl XML Dateien, welche sehr groß werden können.
Aus den XML Dateien brauche ich immer 2 bestimmte Bereiche die zwischen definierten TAGs stehen.
Ich nutze SAX, um das Dokument Element für Element einzulesen. Dann möchte ich gerne bei den definierten TAGs die Inhalte mit (J)DOM weiter verarbeiten.

Soweit die einfache Theorie.

Das einlesen des Dokumentes mittels SAX funktioniert soweit auch ohne Probleme.
Allerdings bekomme ich es auf biegen und brechen nicht hin, den Dokumenteninhalt zwischen einem öffnenden und dem entsprechenden schließenden TAG in eine Variable zu stecken bzw. direkt an meine (J)DOM Instanz zu geben.

Für das Verständnis hier mal ein Beispielhafter Auszug aus einer XML-Datei:

Code:
<address>
  <country>
    <contryName>Germany</countryName>
    <locality Type="town">
      <localityName>Berlin</localityName>
      <postalCode>14199</postalCode>
    </locality>
  </country>
</address>

Nun würde ich gerne ALLES zwischen dem öffnenden und schließenden "address"-TAG entweder in eine String-Variable schreiben oder direkt an meine (J)DOM Parser Instanz weiter geben.

Ich hoffe, ihr habt eine Idee hierzu...
 
Hey,
darf ich fragen wozu du SAX und JDOM verwenden willst bzw. wieso in dieser Form?

Zu deinem Problem:
Kannst du nicht einfach eine globale String Variable anlegen und diese mit Stringverkettung stück für stück füllen?

Ansonsten verstehe ich das Problem nicht so ganz...

Gruß

Buschiii
 
@Buschiii: JDOM läd immer das gesammt dokument in den Speicher, was bei größeren Dateien zu Problemem führen kann.

So wie ich das verstanden hab will er aus großen XML-Dateien mit SAX lesen und dann die ausgelesen Daten mit JDOM weiter verarbeiten.

@LostBoi hast du schonmal über JAXB nachgedacht?
http://de.wikipedia.org/wiki/JAXB

evtl wäre da auch XPATH ganz Interessant
http://de.wikipedia.org/wiki/XPATH
 
Zuletzt bearbeitet:
@Buschiii: Zu Deiner Frage hat Johannes7146 bereits die richtige Antwort gegeben. Da ich nicht weiß, wie groß die Dateien werden können möchte ich direkt auf der sicheren Seite sein und für den ersten Schritt daher mit dem weniger Speicherfressenden SAX arbeiten. Momentan sind meine Testfiles zwischen 300 und 500 MB groß, aber Größen von bis zu 1.5 GB sind durchaus denkbar.

@Johannes7146: XPATH hatte ich mir bereits mal angesehen, allerdings habe ich das auf mein aktuelles Problem nicht so wirklich anwenden können :(

Generell ist aber zu sagen, das ich mittlerweile eine Lösung gefunden habe, beide Techniken zu verwenden.
Leider kann ich aus Copyright-rechtlichen Gründen keinen QT posten, daher versuche ich das mal zu beschreiben.

Mein SAX Parser bekommt einen Standard DocumentHandler zugewiesen, welcher dazu dient das XML Dokument bis zum gewünschten Start-Tag einzulesen. Ist dieses Tag gefunden, erzeuge ich ein neues JDom Element mit dem gefundenen Namen. Danach übergebe ich den XMLReader zusammen mit dem neu erzeugten Element an einen weiteren Handler, welcher dann ab dem Start-Tag den Reader weiter durchläuft und den enthaltenen XML-Baum bis zum End-Tag als JDOM Dokument aufbaut. Bin ich beim End-Tag angekommen wird die erzeugte XML-Struktur an eine Methode weiter gereicht, die sich in einer Verarbeitungsklasse befindet, welche über Filter und Standard JDom Anweisungen die entsprechenden Attribute bzw. Inhalte der Child-Tags ausliest und an die entsprechenden Entity-Klassen weiter reicht.

Ich denke, damit ist das Thema hier erledigt und kann geclosed werden...
 
Zurück