Parameter eines Online XML's abfragen

  • Gibt es eine Möglichkeit, die parameter eines xml-files online abzufragen? die aktion soll nach einem button-klick erfolgen.


    z.B. bei diesem link

    HTML
    http://open.mapquestapi.com/xapi/api/0.6/way%5Blanduse=residential%5D%5Bbbox=9.95194,52.1525,9.95722,52.15556%5D


    würde ich gerne die tags wie "<tag k="landuse" v="residential"/>" abfragen, wie oft diese vorkommen oder ob sie generell vorkommen. ist das möglich? wenn ja, würde ich mich für eine anleitung sehr freuen.
    danke im voraus


    viele grüße

  • ich habe die Anfrage so verstanden, dass du die Dateien online durchforsten wirst.
    Da kenne ich nix zu. Die Parser laden die Daten meines Wissens herunter.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • ah ok, das versuche ich mal gleich. habe gerade was von einem documentBuilderFactory gelesen. Bei stackoverflow-forum haben welche fragen gestellt, wie man xml-datein umwandelt in documente. wäre das überflüssig, oder ist das umwandeln in ein document und auslesen aus einem document der effizientere weg im ganzen, als nur von einem xml-datei auszuslesen?

  • Soweit ich weiß gibt es zwei Möglichkeiten ein XML zu parsen:
    DOM und SAX.
    Vergleich: DOM vs. SAX, Ralf Kunze, 2001


    Du willst die Daten nur einmal durchgehen und deine Schlüsse ziehen. Dafür ist SAX empfehlenswert.
    Via DOM kannst du immer auf das XML als ein Dokument zugreifen. Dein Vorhaben klang nicht so, als ob du das wollen würdest.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • ich möchte nur bestimmte schlüsselwörter auslesen, wie oft diese in der xml-file vorkommen. mehr nicht. O:-)


    NACHTRAG:


    in meinem 1. beitrag habe ich einen beipsiel link gepostet. so sehen die xml-datein aus. das sind ortsbezogene daten, genauer gesagt daten von openstreetmaps. ich möchte z.b. alle 500 meter eine xml-datei runterladen und die schlüsselwörter wie "landuse" auswerten. mit auswerten meine ich z.b. wie oft diese in der xml-file vorkommen. kurz gesagt, alle 500 meter lade ich eine neue datei runter und werte diese aus. wäre dann der SAX parser trotzdem zu empfehlen? oder doch der DOM? oder direkt wie drumliner gepostet hat, die werte auslesen?


    bin etwas verwirrt ehrlich gesagt :-/

  • Da du bei einem Treffer ja nur die Variable 'numberOfLanduseMarks' um eins hoch zählst sollte der SAX Parser ausreichen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hallo Lucas,


    danke für deinen post. ich möchte beide varianten umsetzen (also einmal die paramter aus der runtergeladen xml-file auslesen und online aus einer xml-seite). ich habe dazu bei youtube einen videotutoiral gefunden (Android Application Development Tutorial) (ab folge 154 - 159) da hat der nette Travis (der typ der die videos gepostet hat) gezeigt, wie man aus einer internetseite xml-parameter liest. und zwar hat er eine einfache app geschrieben, wo er in eine editText ein stadt eingibt und nachdem er auf einen button klickt, die Temperatur von der eingegeben stadt anzeigt. sobald er auf einen button klickt, holt er sich die temperaturwert aus der xml einer wetterdienstseite. ich bin mal seinen code gefolgt, jedoch bekomme ich ich nicht den gewünschten wert.


    Die mainActivity sieht folgendermaßen aus:


    die ReadXML()-Methode ist dabei die OnClickMethode vom Button read.


    XMLDataCollected.class


    de XMLHandler


    bekomme keine fehlermeldung wenn ich auf den button klicke. jedoch bekomme ich im textview die "Error :( " message, welche ich in der try-catch methode definiert habe. kann es am link liegen (vielleicht braucht die seite ein paar sekunden bis diese geladen ist) oder doch an code?

  • Genau deshalb hasse ich die Art und Weise, mit der Try-Catch-Blöcke implementiert werden... +seufz+


    Fakt ist: irgendwas geht schief.
    (Die URL sieht jedenfalls ganz gut aus.)


    Problem ist: du weißt nicht was schief geht.


    Besser:


    Zitat

    02-19 16:04:58.436: ERROR/ReadXML(683): IO - is open.mapquestapi.com
    02-19 16:04:58.436: ERROR/ReadXML(683): Problem: InputStream == null. Aborting


    IOException beim Versuch, den InputStream zu erzeugen.
    Doku sagt:
    "Equivalent to openConnection().getInputStream(types)."
    Dann versuchen wir das mal.



    (Zum Glück sagt mir meine IDE, welche nicht abgefangenen Exceptions sie so erwartet - da muss ich dann nicht so lange rumsuchen...)

    Zitat

    02-19 16:14:28.416: ERROR/ReadXML(814): IO - getInputStream open.mapquestapi.com
    02-19 16:14:28.416: ERROR/ReadXML(814): Problem: Stream == null. Aborting


    Tja, und nun?
    Machen wir aus dem e.getMessage() ein e.toString():

    Zitat

    02-19 16:20:30.796: ERROR/ReadXML(948): IO - getInputStream java.net.UnknownHostException: open.mapquestapi.com
    02-19 16:20:30.796: ERROR/ReadXML(948): Problem: Stream == null. Aborting


    Aha. Host open.mapquestapi.com unbekannt.
    Die Berechtigungen für Internet sind aber gesetzt.


    Emulator neu gestartet, nachdem ich mich vergewissert habe, dass das Internet dort korrekt läuft:
    Keine Besserung.


    open.mapquestapi.com gegen 205.188.201.176 getauscht:

    Zitat

    02-19 16:29:53.585: ERROR/ReadXML(369): IO - getInputStream java.net.SocketException: Permission denied
    02-19 16:29:53.585: ERROR/ReadXML(369): Problem: Stream == null. Aborting


    Och mennoooo, falsche AndroidManifest.xml angepasst... +knurr+

    Zitat

    02-19 16:33:04.236: ERROR/ReadXML(433): Info: residential


    Aha.


    Dann wieder zurück von IP auf Hostnamen:

    Zitat

    02-19 16:33:52.825: ERROR/ReadXML(466): Info: residential


    Jau, läuft.
    (Das war dann mal ein Crash-Kurs im Debugging. Wobei 'crash' in Verbindung mit '30 Minuten' echt geprahlt ist... :P)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Woah... Lucas :D :-O


    danke für deine mühe, wirklich. Das finde ich voll korrekt. musste zwischendurch lachen als ich deinen beitrag las (z.b. bei ...Och mennoooo, falsche AndroidManifest.xml angepasst... +knurr+) :D


    ich habe mal das so übernommen wie du es gepostet hast in meine ReadXML methode. wenn ich diese ausführe, bekomme ich ganz andere fehlermeldungen als du !?!!!? (waarruuum??) :-X ;(



    im debug modus hängt sich das auf. kannst du aus der fehlermeldung was anfangen? ich raffe gar nix. will der eine httpURLconnectioN oder was?

  • +hm+

    Zitat

    02-19 17:16:07.355: E/AndroidRuntime(14446): Caused by: android.os.NetworkOnMainThreadException


    Kann es sein, dass dein Device/AVD nicht auf 2.3.3 sondern was Neuerem läuft?
    Falls ja, dann musst du die Netzwerksachen auf einen anderen Thread auslagern.
    Steht doch da. ;)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Zudem hatte ja der user drumliner in einem anderen thread von mir folgendes zu der NetworkOnMainThreadException gepostet:

    Hauptfehler ist hier, dass du die Daten im MainThread laden möchtest,
    was nicht mehr gestattet ist. Würdest du gleiches auf alten Android
    Systemen probieren würdest du merken, dass das funktioniert.




    In der aktuellen Variante ist es aber so, dass Google dich dazu zwingt
    diese Dinge im AsyncTask bzw. in einem Thread laufen zu lassen, damit
    der Mainthread nicht von solchen Dingen blockiert wird.


    hmm... habe ich gerade nochmal gelesen. ok, dann werde ich es erstmal auf 2.3.3 versuchen und anschließend mit einem thread.

  • Du kannst zu Testzwecken auch den strictmode deaktivieren, dann hast du keine network on main thread Exception mehr:


    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder(
    StrictMode.getThreadPolicy()).permitNetwork().build());

  • morgäähn,


    also ich habe das mit dem thread gemacht, bekomme auch keine fehlermeldung mehr ;)


    jedoch bekomme ich als Ergebnis immer null :-/


    lucas, wie hast du das gemacht?? wieso kommt bei dir das gewünschte ergebnis und bei mir net?? ;(


    der code wenn auf den button geklickt wird, wird der thread gestartet:


    Code
    public void MainActivity ....
    ...
    public void ReadXML(View v) 
    	{
    		readXMLThread = new ReadXMLThread();
    		Thread thread = new Thread(readXMLThread);
    		thread.start();
    }
    ....


    der Thread:


    eine zusätzliche frage noch: in einem thread kann ich z.b. wenn ich das ergebnis habe (also einen string), den nicht an eine textview zuweisen oder? also im obigen code z.b. könnte man nicht string information an eine textview zuweisen?? habe das versucht, bekam einen error. (das ist eine allgemeine frage was bezogen ist auf threads)

  • 1) Ich weiß nicht. Handler bearbeitet?
    2) Stimmt, du kannst nur über den UI Thread auf dein Textview zugreifen.
    Wenn du dir aber vor dem Thread eine Referenz auf den UI Thread setzt, dürfte das laufen.
    Schau mal nach android.os.Handler.post(Runnable)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Zu 1) ne hab nix geändert beim handler sowie bei xmlDataCollected. das ist komisch. wenn einer das auch bestätigen würde, häte ich eine vermutung, z.b das es daran liegen könnte, das sofort nach dem string abfragt wird, obwohl die werte noch nicht vorliegen, da die seite ja ein paar sekunden zum laden braucht. (bin mir aber nicht sicher)


    zu 2) ah ok. danke ;)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!