XmlPullParser Error

  • Antworten:10
  • Bentwortet
Aaron B.
  • Forum-Beiträge: 206

07.09.2013, 11:26:53 via App

Hallo!

Ich versuche gerade, einen String (FileInputStream mit xml-file) zu parsen. In meiner anderen App habe ich den xmlResourceParser benutzt. Da diese Datei jedoch nicht im Resource-Verzeichnis ist, kann ich diesen nicht nutzen. Ich habe deshalb den XmlPullParser genutzt, doch die App stürzt mit Exception.getMessage() == null ab.

elemName ist soweit och weiß null und das system stürzt beim Versuch ab, xpa.getAttributeIntValue() zu erhalten.

Ich weiß nicht, was an diesen Codes falsch ist. Danke im Voraus für Antworten :)

Codes:

Mein Parser:
1package de.aaronburmeister.scenesrpgcreating.app;
2
3import android.content.*;
4import android.graphics.*;
5import android.util.*;
6import android.widget.*;
7import java.io.*;
8import java.util.*;
9import org.xmlpull.v1.*;
10
11public class SceneParser
12{
13
14 public static final String namespace = "http://rpgview.ab.de";
15
16 private ArrayList<RPGObject> objects;
17 private ArrayList<RPGObject> overlayObjects;
18 private ArrayList<RPGObject> autoOverlayObjects;
19 private ArrayList<RPGObject> actions;
20 private ArrayList<RPGObject> imports;
21 private RPGObject scene;
22 private String playerRes;
23 private String dir;
24
25 private Context c;
26 private float fieldSize;
27 private String projectPath;
28
29[...]
30
31 public void parseForView(String xml, Context c, float fieldSize) throws XmlPullParserException, IOException
32 {
33 objects = new ArrayList<RPGObject>();
34 overlayObjects = new ArrayList<RPGObject>();
35 autoOverlayObjects = new ArrayList<RPGObject>();
36 actions = new ArrayList<RPGObject>();
37 scene = new RPGObject();
38
39 XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
40 //factory.setNamespaceAware(true);
41 XmlPullParser xpp = factory.newPullParser();
42 xpp.setInput(new StringReader(xml));
43 //xpp.next();
44 int eventType = xpp.getEventType();
45 while(eventType != XmlPullParser.END_DOCUMENT) {
46 if(eventType == XmlPullParser.START_TAG) {
47 String elemName = xpp.getName();
48
49 XmlPullAttributes xpa = new XmlPullAttributes(xpp);
50
51 if(elemName.equals("scene")) {
52 scene.setWidth(xpa.getAttributeIntValue(namespace, "width", 1));
53 scene.setHeight(xpa.getAttributeIntValue(namespace, "height", 1));
54 scene.setGraphic(xpa.getAttributeValue(namespace, "graphic"));
55 scene.setBigScaled(xpa.getAttributeBooleanValue(namespace, "bigScaled", false));
56 playerRes = xpp.getAttributeValue(namespace, "player");
57 dir = xpp.getAttributeValue(namespace, "direction");
58
59 if(scene.isBigScaled()) {
60 scene.setImage(Bitmap.createScaledBitmap(BitmapFactory.decodeFile(projectPath + File.separator + "graphics" + File.separator + scene.getGraphic() + ".png"), Math.round(scene.getWidth() * fieldSize), Math.round(scene.getHeight() * fieldSize), true));
61 } else {
62 Bitmap bmp = BitmapFactory.decodeFile(projectPath + File.separator + "graphics" + File.separator + scene.getGraphic() + ".png");
63 bmp = Bitmap.createScaledBitmap(bmp, Math.round(fieldSize), Math.round(fieldSize), true);
64 scene.setImage(bmp);
65 }
66 } else if(elemName.equals("object")) {
67 RPGObject o = new RPGObject();
68 o.setWidth(xpa.getAttributeIntValue(namespace, "width", 1));
69 o.setHeight(xpa.getAttributeIntValue(namespace, "height", 1));
70 o.setStartX(xpa.getAttributeIntValue(namespace, "startX", 1));
71 o.setStartY(xpa.getAttributeIntValue(namespace, "startY", 1));
72 o.setGraphic(xpa.getAttributeValue(namespace, "graphic"));
73 o.setBigScaled(xpa.getAttributeBooleanValue(namespace, "bigScaled", false));
74 o.setAccessible(xpa.getAttributeBooleanValue(namespace, "accessible", true));
75 o.setAccessibleTop(xpa.getAttributeBooleanValue(namespace, "accessibleTop", true));
76 o.setAccessibleLeft(xpa.getAttributeBooleanValue(namespace, "accessibleLeft", true));
77 o.setAccessibleRight(xpa.getAttributeBooleanValue(namespace, "accessibleRight", true));
78 o.setAccessibleBottom(xpa.getAttributeBooleanValue(namespace, "accessibleBottom", true));
79
80 if(o.isBigScaled()) {
81 o.setImage(Bitmap.createScaledBitmap(BitmapFactory.decodeFile(projectPath + File.separator + "graphics" + o.getGraphic() + ".png"), Math.round(o.getWidth() * fieldSize), Math.round(o.getHeight() * fieldSize), true));
82 } else {
83 Bitmap bmp = BitmapFactory.decodeFile(projectPath + File.separator + "graphics" + File.separator + o.getGraphic() + ".png");
84 bmp = Bitmap.createScaledBitmap(bmp, Math.round(fieldSize), Math.round(fieldSize), true);
85 o.setImage(bmp);
86 }
87
88 objects.add(o);
89 }
90 eventType = xpp.next();
91 }
92 }
93
94 public static class XmlPullAttributes implements AttributeSet {
95
96 public XmlPullAttributes(XmlPullParser parser) {
97 mParser = parser;
98 }
99
100[...]
101//uses XmlUtils for getters

Meine TestFile:
1<?xml version="1.0" encoding="utf-8" ?>
2<scene xmlns:rpg="http://rpgview.ab.de"
3 rpg:width="100"
4 rpg:height="40"
5 rpg:graphic="wiese"
6 rpg:player="player_mask"
7 rpg:direction="right" >
8
9 <object
10 rpg:width="8"
11 rpg:height="40"
12 rpg:startX="-7"
13 rpg:graphic="wiese" />
14
15</scene>

Mein Test-Parser:

ScenesEditor.path ist der Pfad zur File.
FileUtils.Reader.read(String path) liest die Datei problemlos.
1SceneParser sp = new SceneParser();
2 try {
3 sp.parseForView(FileUtils.Reader.read(ScenesEditor.path), c, fieldSize);
4 } catch(Exception e) {
5
6 }

XmlUtils:
https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/util/XmlUtils.java

— geändert am 07.09.2013, 15:17:08

Antworten
impjor
  • Forum-Beiträge: 1.793

07.09.2013, 12:28:11 via Website

Vorneweg, ich habe mir den Code nicht angesehn. Bitte schaue selber einmal ins LogCat, wo der Fehler liegt. Wenn du schon weißt, dass ein Objekt null ist, frage ich mich, warum du das nciht berichtigst oder uns nur die entsprechenden Zeilen zeigst. So viel Code ließt sich doch keiner durch, zumal auch viele Setter/Getter dabei sind, die man einfach weglassen könnte.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Aaron B.
  • Forum-Beiträge: 206

07.09.2013, 13:47:11 via App

Im Logcat kommt nur, wenn ich Log.e ("tag", e.getMessage () == null ? "null", e.getMessage ()) sxhreibe "null". elemName ist XmlPullParser.getName(); und das mit dem code mache ich bei der nächsten Frage besser. :)

LG

— geändert am 07.09.2013, 13:47:50

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

07.09.2013, 14:39:00 via Website

Aaron B.
Im Logcat kommt nur, wenn ich Log.e ("tag", e.getMessage () == null ? "null", e.getMessage ()) sxhreibe "null". elemName ist XmlPullParser.getName(); und das mit dem code mache ich bei der nächsten Frage besser. :)

LG

Hallo,
nur so ein Tipp am Rande.
Wenn du wirklich Hilfe möchtest ... mach es doch JETZT besser.
Das sind 1000+ Zeilen Code. Du bekommst durch die Exception genau angezeigt wo der Fehler passiert.
Somit bereite das doch schon etwas vor ...

Gruß

Antworten
Aaron B.
  • Forum-Beiträge: 206

07.09.2013, 15:11:19 via App

Ich habe den code jetzt gekürzt.

LG

— geändert am 07.09.2013, 15:11:26

Antworten
impjor
  • Forum-Beiträge: 1.793

07.09.2013, 18:48:23 via App

Vielleicht solltest du nochmal spezifizieren, was genau nicht funktioniert! Wenn die App abstürzt, kommt ins LogCat eine rote Meldung. Du musst nichts selber ins LogCat schreiben. Zudem ist es fraglich, warum du dieses seltsame Konstrukt verwendest: e.getMessage == null ? ...
Wo steht das? In einem catch-Block? Da ist e garantiert nicht null. Zudem solltest du lieber e.printStackTrace() verwenden.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Aaron B.
  • Forum-Beiträge: 206

07.09.2013, 21:06:32 via App

Ja, das habe ich in einen catch-Block geschrieben. Und dieses Struktur ist da, weil trotz try / catch die App abgestürzt ist. Also wollte überprüfen, ob es an einer nullPointerException liegt. Momentan stürzt die App ab, obwohl ich den Code in einen try-block geschrieben habe.

LG

Antworten
impjor
  • Forum-Beiträge: 1.793

07.09.2013, 23:17:58 via App

lass den try-catch-Block einach ganz weg. Nur weil der Fehler dann nicht angezeigt wird ist er noch nicht weg...
Poste danach dann das Logcat.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Aaron B.
  • Forum-Beiträge: 206

08.09.2013, 08:26:56 via App

Also das try / catch kann ich nicht weglassen, weil die Methode eine XmlPullParserException und eine IOException wirft. Meine App stürzt aber trotz try / catch ab, weshalb mir mein LogCat nichts anzeigt. (gefiltert nach dem Prozess meiner App) Ich habe schon versucht, das ganze im UIThread laufen zu lassen, aber das bringt nichts.

Lg

— geändert am 09.09.2013, 10:08:03

Antworten
Aaron B.
  • Forum-Beiträge: 206

09.09.2013, 10:08:29 via App

Ist mein Code soweit richtig?
(Parser & Xml-File) Bis jetzt habe ich im Internet nur folgende Xml-Struktur mit dem PullParser gesehen, aber er hat ja die Funktion getAttributeValue().

1<item>
2<foo> Value </foo>
3<name> Value </name>
4etc.
5</item>

Antworten
Aaron B.
  • Forum-Beiträge: 206

10.09.2013, 12:04:59 via App

Ok ich habs behoben: In der Datei XmlUtils waren einige Fehler, die nicht angezeigt wurden (Falsche Leer-Zeichen, die dann zu einem Build-Fehler geführt haben)

Danke für alle Hilfen :)

Antworten