Lokale XML und SAX-Parser

  • Antworten:7
  • Bentwortet
Hermann S.
  • Forum-Beiträge: 45

23.04.2011, 10:30:12 via Website

Hallo, ich möchte mir einen gemeinsamen Handler zum Parsen einer lokalen XML und einer XML auf dem Webserver machen.
Dafür habe ich mir eine Klasse erstellt, die im Konstruktor den Parameter des Typs InputSource erwartet.

In der gemeinsam genutzten Klasse (XmlParser) steht dann sowas wie.
1...
2public XmlParser(InputSource inputSource) {
3...
4public MyHandler parse() {
5SAXParserFactory spf = SAXParserFactory.newInstance();
6SAXParser sp = spf.newSAXParser();
7XMLReader xr = sp.getXMLReader();
8...
9MyHandler myHandler = new MyHandler();
10xr.setContentHandler(myHandler);
11...
12xr.parse(inputSource);
13...
14usw.

In der Klasse für die Web-XML steht sowas ähnliches
1...
2inputSource = new InputSource(httpEntity.getContent());
3XmlParser xmlParser = new XmlParser(inputSource);
4MyHandler myHandler = xmlParser.parse();
5...

In der Klasse für die lokale XML steht sowas.
1...
2// inputStream wird über Konstruktorparameter der Start-Activity übergeben
3(InputStream inputStream = getResources().openRawResource(R.xml.myxml);)
4...
5InputSource inputSource = new InputSource(inputStream);
6XmlParser xmlParser = new XmlParser(inputSource);
7MyHandler myHandler = xmlParser.parse();
8...

Das Parsen der XML auf dem Webserver funktioniert, aber die lokale Datei wird leider nicht geparst. Ich vermute, dass der Inputstream nicht der Gleiche ist, wie bei der XML aus dem Web. Muss man ihn noch irgendwie konvertieren?

— geändert am 23.04.2011, 10:38:37

Antworten
Markus B.
  • Forum-Beiträge: 636

23.04.2011, 13:39:27 via Website

Hallo,
ob du nun eine XML-Datei vom Webserver oder von einer lokalen Resource parsed spielt keine Rollen, da es beides XML-Dateien sind.
Aber vergleich doch einfach mal die Datei vom Webserver und von der lokalen Resource. Danach kannst du Unterschiede schon mal ausschließen.
Zu der XML-Datei von der lokalen Resource:
Bekommst du da eine Fehlermeldung ?

Gruß,
Markus

Antworten
Hermann S.
  • Forum-Beiträge: 45

23.04.2011, 15:10:04 via Website

Eine Fehlermeldung bekomme ich leider nicht.
Hab die lokale XML probehalber, so wie sie ist auf den Webspace hoch geladen, sie lässt sich parsen.

Ich habe meinen Test-Code bis auf das Nötigste gekürzt, vielleicht lässt sich das Problem so einfacher finden.

Mit diesem Code konnte ich eine InputSource erstellen, welche mein Parser erfolgreich parsen konnte.
1InputStreamReader isr = null;
2 try {
3 InputStream is = new URL("http://.../service.xml").openStream();
4 isr = new InputStreamReader(is);
5 Log.v(TAG, "isr:"+ isr);
6 } catch (Exception e) {}
7 InputSource inputSource = new InputSource(isr);


Mit dem folgenden Code habe ich versucht eine InputSource für die lokale XML zu erstellen
1InputStreamReader isr = null;
2 try {
3 FileInputStream fis = new FileInputStream(new File("res/raw/service.xml"));
4 isr = new InputStreamReader(fis);
5 Log.v(TAG, "isr:"+ isr);
6 } catch (FileNotFoundException e) {
7 Log.v(TAG, "isr not found:"+e);
8 }
9 InputSource inputSource = new InputSource(isr);

Das Log gibt eine File Not Found Exception aus. Bin etwas ratlos. Ich denke mein Problem ist es eine brauchbare InputSource aus der lokalen Datei zu erstellen.

EDIT: Hab gerade nochmal etwas ausprobiert.

InputStream inputStream = getResources().openRawResource(R.xml.service);
InputSource inputSource = new InputSource(new InputStreamReader(inputStream));

Da ich die Datei nicht direkt öffnen konnte, habe ich den InputStream nochmal über openRawResource geöffnet, aber diesmal den Stream vom StreamReader für die InputSource genommen. Jetzt scheint es zu funktionieren. Ist ganz schön verwirrend mit den vielen verschiedenen Streams :)

Das Problem ist somit gelöst. Mich würde aber dennoch interessieren, warum die Datei über new FileInputStream(new File("res/raw/service.xml")) nicht auffindbar ist.

— geändert am 23.04.2011, 15:32:46

Antworten
Markus B.
  • Forum-Beiträge: 636

23.04.2011, 17:01:53 via Website

Hi,
das kann ich dir erklären :)
Android behandelt Resources anhand des Ortes unterschiedlich.

res/raw :
Hier liegen in der Regel Multimediadateien also MP3 / MPEG-4 / OGG usw.
Die entsprechenden Dateien werden so wie sie in dem Verzeichnis liegen mit in da apk gepackt.
Auf diese Quellen (res/raw) wird eben über openRawResource zugegriffen.

res/xml:
Hier werden in der Regel entsprechend xml-Dateien abgelegt :)
Der Unterschied zu res/raw ist das der Inhalt hier beim Packen des apk in ein binäres Format umgewandelt werden (Genauer gesagt macht das aapt für dich).
Wenn du also eine Xml-Datei legen willst und diese unter res/xml liegt, kannst du es wie folgt machen:
1final Resources res = this.getResources();
2 final XmlResourceParser xmlResourceParser = res.getXml(R.xml.test);

Wie du dort nun einen InputStream bekommst müsste noch eben schauen, aber die Nugel warten gerade noch auf dem Tisch :)

Gruß,
Markus

— geändert am 23.04.2011, 17:02:56

Antworten
Hermann S.
  • Forum-Beiträge: 45

24.04.2011, 02:21:14 via Website

Das erklärt natürlich, weshalb sich bei mir manche Dateien nicht so einfach finden ließen.
Danke :)

Antworten
Iven Z.
  • Forum-Beiträge: 15

01.07.2011, 20:34:46 via Website

Ich würde gern den Thread hier nochmal hoch holen.

Ich benutze ebenfalls den SAXParser um mit einem XML File in meinem Android Projekt zu arbeiten.

Das ganze funktioniert auch.
Aber leider nur im Emulator.
Sobald ich auf nem Device (SE Xperia X10 mini pro) teste, erkennt er das geparste nicht.

Muss man fürs Device nochmal irgendeine Einstellung vornehmen ?

Antworten
Markus B.
  • Forum-Beiträge: 636

01.07.2011, 22:17:30 via App

Hi,
das du etwas am Gerät einstellen musst halte ich für unwahrscheinlich. Was genau meinst du denn mit Dr erkennt das geparsed nicht?
Gulruß, Markus

Antworten
Iven Z.
  • Forum-Beiträge: 15

02.07.2011, 10:40:26 via Website

Moin Marcus,

also ich benutze den Parser um eine ExpandableViewList zu füllen.
Und wenn ich diese auf dem Gerät öffnen will, zeigt er einfach keine Einträge an.

Stoß ich eventuell irgnedwie an Speichergrenzen ?
Die größten Speicherfresser sind folgende Arrays:

array[4]
array[4][100]
array[4][100]
array[4][100]
array[4][100]

Antworten