1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Lesen von richtig großen XML Dateien

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von jskeletti, 19.05.2011.

  1. jskeletti, 19.05.2011 #1
    jskeletti

    jskeletti Threadstarter Erfahrener Benutzer

    Beiträge:
    156
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    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 0nodeList.getLength(); i++) {
         for (
    int j 0nodeList.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());
    }
     
  2. ko5tik, 19.05.2011 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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
     
    jskeletti bedankt sich.
  3. jskeletti, 19.05.2011 #3
    jskeletti

    jskeletti Threadstarter Erfahrener Benutzer

    Beiträge:
    156
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Wo finde ich den Jackson XML Parser?
     
  4. ko5tik, 19.05.2011 #4
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    jackson.codehaus.org - aber ich würde eher XPP empfehlen, da es schon dabei ist. Jackson ist ein sehr schweres Geschütz
     
  5. jskeletti, 19.05.2011 #5
    jskeletti

    jskeletti Threadstarter Erfahrener Benutzer

    Beiträge:
    156
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Ich probiere alle drei aus und meld mich nochmal :)
     
  6. jskeletti, 20.05.2011 #6
    jskeletti

    jskeletti Threadstarter Erfahrener Benutzer

    Beiträge:
    156
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    Leider bekomme ich folgenden Fehler bei SAX:

    Wo muß ich dieses property setzen?
     
  7. ko5tik, 20.05.2011 #7
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Kannst du etwas mehr con deinen Code posten?
     
  8. jskeletti, 20.05.2011 #8
    jskeletti

    jskeletti Threadstarter Erfahrener Benutzer

    Beiträge:
    156
    Erhaltene Danke:
    6
    Registriert seit:
    11.08.2010
    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.
     

Diese Seite empfehlen