Lesen von richtig großen XML Dateien

J

jskeletti

Fortgeschrittenes Mitglied
19
Wie würdet ihr eine richtig große XML Datei am besten (und schnellsten) lesen und verarbeiten? In meinem Fall hab ich eine XML Datei mit mindestens 14000 Zeilen. Allein das laden und verarbeiten dauert um die 15-20 Sekunden, was für einen Benutzer viel zu viel Zeit ist. Ich würde das gern auf ein Minimum verkürzen. Hat jemand Erfahrung mit so etwas?

Mein Quellcode bisher:
PHP:
try {
  /* Create a URL we want to load some xml-data from. */
   URL url = new URL("http://path/to/xml");

   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   DocumentBuilder db = dbf.newDocumentBuilder();
   Document doc = db.parse(new InputSource(url.openStream()));

   NodeList nodeList = doc.getElementsByTagName("utr");

   for (int i = 0; i < nodeList.getLength(); i++) {
     for (int j = 0; j < nodeList.item(i).getChildNodes().getLength(); j++) {                   
     // Hier einfach nur ne Ausgabe im Logfenster, später Verarbeitung
     System.out.println(nodeList.item(i).getChildNodes().item(j).getNodeName() + " = " + nodeList.item(i).getChildNodes().item(j).getNodeValue());
     }
  }
} catch (Exception ex) {
   Log.e("Fehler", ex.toString());
}
 
Di verwendest DOM-Parser, welches eine Kompletten Objelt-Baum im Speicher anlegt
( Speicher vrebrauch hoch, viel Allokation usv - dauert lange )

Besserre vorgehensweise ist:
- SAX-Parser ( Push-Parser, Anwendung wird von Parser gertrieben, du muss einen Event-Handler schreiben )
oder
- Pull-Parser ( Parsen wird von AZnwendung ausgelöst, Anwendung holt einzelne Events ab )

Beide verbrauchen wesentlich weniger Speicher und sind somit schneller - und beide sind im Standart-Android enthalten.

Wenn es ganz schnel sein muss, nimmt man den Jackson XML Parser - ist schnellste was es zur Zeit gibt, aber eine externe Abhängigkeit
 
  • Danke
Reaktionen: jskeletti
Wo finde ich den Jackson XML Parser?
 
jackson.codehaus.org - aber ich würde eher XPP empfehlen, da es schon dabei ist. Jackson ist ein sehr schweres Geschütz
 
Ich probiere alle drei aus und meld mich nochmal :)
 
Leider bekomme ich folgenden Fehler bei SAX:

05-20 10:00:52.922: ERROR/Fehler(382): org.xml.sax.SAXException: Can't create default XMLReader; is system property org.xml.sax.driver set?

Wo muß ich dieses property setzen?
 
Kannst du etwas mehr con deinen Code posten?
 
Hab's gerade gelöst. So wird's gelesen:

PHP:
try {
  // Pfad zur XML Datei
  URL url = new URL("http://path/to/xml");

  // XMLReader erzeugen
  SAXParserFactory spf = SAXParserFactory.newInstance();
  SAXParser sp = spf.newSAXParser();
  XMLReader xr = sp.getXMLReader();
  ContentHandler handler = new ContentHandler();
  xr.setContentHandler(handler);

  xr.parse(new InputSource(url.openStream()));
} catch (Exception ex) {
   Log.e("Fehler", ex.toString());
}

Wie die Geschwindigkeit ist, weiß ich allerdings noch nicht.
 

Ähnliche Themen

netfreak
  • netfreak
Antworten
10
Aufrufe
457
netfreak
netfreak
M
  • MikelKatzengreis
Antworten
5
Aufrufe
128
swa00
swa00
B
Antworten
4
Aufrufe
491
bb321
B
Zurück
Oben Unten