XmlPullParser - erkennt die Tags nicht

  • Antworten:10
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 690

16.04.2016, 15:47:21 via Website

Hallo,

mit einem XmlPullParser möchte ich eine vorher geschriebene (über XmlSerializer) XML-Datei einlesen. Der Code dafür sieht so aus:

public void cmm_CubeDatenLaden(File VerwaltungsXmlDatei) {
// http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

        String tmp_CubeRaumName     = "";
        Byte tmp_CubeRaumSN         = 0;

        String tmp_CubeDeviceName   = "";
        int tmp_CubeDeviceRaumId    = 0;
        String tmp_CubeDeviceRFA    = "";
        String tmp_CubeDeviceSN     = "";

        try {
            XmlPullParserFactory factory = newInstance();
            factory.setNamespaceAware(false);
            XmlPullParser xpp = factory.newPullParser();
            xpp.setInput(new FileReader(VerwaltungsXmlDatei));
            int EventType = xpp.getEventType();
            while (EventType != XmlPullParser.END_DOCUMENT) {
                if (EventType == XmlPullParser.START_DOCUMENT) {
                    // Ist eigentlich unwichtig
                }

                else if (EventType == XmlPullParser.START_TAG) {
                    // ermitteln, welches Tag hier anfängt
                    String xmlStartTag = xpp.getName();
                    if (xmlStartTag == "H-Message") {     // Auswertung H-Message (Cube-Daten)
                        if (xmlStartTag == XML_CUBE_NAME) {
                            String StrCubeName = xpp.getText();
                            CubeCubeName = StrCubeName;
                        }
                        // weitere Daten über den Cube (noch nicht implementiert)
                    }
                    /*if (xmlStartTag == XML_C_MESSAGE) {   // Auswertung C-Message (noch nicht implementiert)

                    }*/
                    if (xmlStartTag == XML_M_MESSAGE) {     // Auswertung M-Message (Räume und Devices pro Raum)
                        if (xmlStartTag == XML_RAUM_NAME) {
                            tmp_CubeRaumName = xpp.getAttributeValue(0);
                            tmp_CubeRaumSN   = Byte.parseByte(xpp.getAttributeValue(1));

                        }
                        if (xmlStartTag == XML_GERAET_NAME) {
                            tmp_CubeDeviceName = xpp.getAttributeValue(0);
                            tmp_CubeDeviceRaumId = Integer.parseInt(xpp.getAttributeValue(1));
                            tmp_CubeDeviceRFA = xpp.getAttributeValue(2);
                            tmp_CubeDeviceRFA = xpp.getAttributeValue(3);
                        }
                    }
                }
                else if (EventType == XmlPullParser.END_TAG) {
                    String xmlEndTag = xpp.getName();
                    if (xmlEndTag == XML_RAUM_NAME) {       // den Raum in die Liste aufnehmen
                        cCubeRaum AktRaum = new cCubeRaum();
                        AktRaum.setRaumName(tmp_CubeRaumName);
                        AktRaum.setRaumID(tmp_CubeRaumSN);
                        CubeNetz.add(AktRaum);
                        AktRaum = null;
                    }
                    if (xmlEndTag == XML_GERAET_NAME) {
                        // erstmal das Device füllen
                        cCubeDevice AktDevice = new cCubeDevice();
                        AktDevice.setDeviceName(tmp_CubeDeviceName);
                        AktDevice.setDeviceRoomID(tmp_CubeDeviceRaumId);
                        AktDevice.setDeviceRFAddress(tmp_CubeDeviceRFA);
                        AktDevice.setDeviceSeriennummer(tmp_CubeDeviceSN);
                        // Jetzt anhand der RoomID den Raum finden und dort in die Device-Liste einhängen
                        int RaumIndex = 0;
                        while ((CubeNetz.get(RaumIndex).getRaumID() != tmp_CubeDeviceRaumId) &&
                       (RaumIndex < CubeNetz.size()) ) {
                            RaumIndex++;
                        }
                        cCubeRaum AktRaumForDevice = CubeNetz.get(RaumIndex);
                        AktRaumForDevice.GeraeteInRaum.add(AktDevice);
                    }
                }
                EventType = xpp.next();
            }

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Das Vorhandensein von File VerwaltungsXmlDateiist vorher überprüft worden. Hinter CubeNetzsteckt eine ArrayList, die eine (nicht bekannte) Anzahl cCubeRaumenthält. Jeder cCubeRaumwiederrum enthält u. a. eine ArrayListmit einer (nicht bekannten) Anzahl cCubeDevice. Das ist auch gar nicht das Problem.
Das Problem:
Bei allen Abfragen, um welches Tag es sind handelt (Bsp. if (xmlStartTag == "H-Message")) wird der dazugehörige Anweisungsteil überhaupt nicht ausgeführt - es wird nicht erkannt, dass xmlStartTagaktuell wirklich den Wert "H-Message" enthält. Und das gilt für alle Abfragen. Ich habe es probiert, statt des direkten String-Vergleichs einen Vergleich mit einer vordefinierten Konstanten (hier als static final String XML_H_MESSAGE = "H-Message";) zu lösen, aber auch das funktioniert nicht.

Warum funktioniert das so nicht?

Hier noch die dazugehörige XML-Datei:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><H-Message><CubeName>Cube</CubeName></H-Message><M-Message><Raum Name="Wohnzimmer" SN="1"><Gerät Name="Wohnzimmer" ID="1" /></Raum><Raum Name="Schlafzimmer" SN="2"><Gerät Name="Schlafen" ID="1" /></Raum><Raum Name="Bᅢᄐro" SN="3"><Gerät Name="Bᅢᄐro" ID="1" /></Raum><Raum Name="Badezimmer" SN="4"><Gerät Name="Bad" ID="1" /></Raum><Raum Name="Gᅢᄂstezimmer" SN="5"><Gerät Name="Gᅢᄂstezimmer" ID="1" /></Raum></M-Message>

Danke und Gruss

G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

16.04.2016, 16:00:37 via App

Mach mal einen string verlgeich mit String#equals(otherString).
Dann müsste es gehen.
Strings vergleichen mit == ist immer so eine sache die man lieber nicht macht.

Zudem:
Warum nimmst du überhaupt einen XML PullParser. Wenn du das ganze in ne XML Serialisierst kannst du es aus dem XML doch wieder einfacher in dein Objekt deseeialisieren.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 690

16.04.2016, 16:10:37 via Website

Pascal P.

Mach mal einen string verlgeich mit String#equals(otherString).
Dann müsste es gehen.
Strings vergleichen mit == ist immer so eine sache die man lieber nicht macht.

Das teste ich mal - hab ich natürlich mal wieder nicht dran gedacht :?

Zudem:
Warum nimmst du überhaupt einen XML PullParser. Wenn du das ganze in ne XML Serialisierst kannst du es aus dem XML doch wieder einfacher in dein Objekt deseeialisieren.

Dafür fehlt mir Wissen. Nach der Beschreibung aus http://developer.android.com/reference/org/xmlpull/v1/XmlSerializer.html kann ich damit nur XML schreiben, aber nicht wieder lesen - dafür soll doch der XmlPullParser sein. Zumindest verstehe ich das so. Oder geht das anders?

Danke und Gruss

G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

16.04.2016, 16:26:00 via Website

Also wenn du mit dem PullParser machen willst
z.b.

http://blog.brianbuikema.com/2010/04/android-how-to-deserialize-both-xml-and-json/

Sonst mit externer Lib:
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize

oder
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize

Muss es zwingend XML sein?

Für Json gibt es das mit Google gson als Lib, deserialisieren und Serialisieren in ein paar Zeilen Code

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 690

16.04.2016, 16:52:33 via Website

Das muss ich in Ruhe lesen....ich melde mich.
Danke.

N'y pas n'y
tu car tu
mal tu mal

Antworten
  • Forum-Beiträge: 690

17.04.2016, 21:25:46 via Website

Gerd-Ulrich M.

Das muss ich in Ruhe lesen....ich melde mich.

So, hab ich jetzt getan.

Pascal P.

Also wenn du mit dem PullParser machen willst

Der shceint mir zumindest das von Google für Android empfohlene Verfahren zu sein.

z.b.

http://blog.brianbuikema.com/2010/04/android-how-to-deserialize-both-xml-and-json/

Hat den Nachteil, dass ich auch meine Speicher-(Serialisierungs-)routine neu schreiben muss - und die hat mir gerade die XML-Datei geliefert.

Sonst mit externer Lib:
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize

oder
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#deserialize

Ist es Absicht, dass beide Links zum gleichen führen?

Muss es zwingend XML sein?

Für Json gibt es das mit Google gson als Lib, deserialisieren und Serialisieren in ein paar Zeilen Code

XML ist nicht Pflicht - aber wäre schön.

Danke.

Gruss

G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

17.04.2016, 21:38:38 via App

Ähm ne hab wohl 2x mal den gleichen kopiert.
War aber nur der stackoverflow Thread du der Lib.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 690

18.04.2016, 14:45:20 via Website

So wie's aussieht, werd ich wohl auf XML verzichten und doch JSON verwenden - hab mir das heute früh angeguckt und es scheint einfacher und konsistenter zu sein. Spricht was dagegen, die von Google angebotenen Klassen JsonWriter und JsonReader zu verwenden (ich weiß, oben gibts Links, die auf andere Möglichkeiten verweisen)? Da meine Daten relativ einfach sind, müssten die doch reichen, oder?

Gruss

G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.166

18.04.2016, 15:39:40 via App

Eigentlich ja würde jedoch mit Gson arbeiten und Serialize und derserialize verwenden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 690

18.04.2016, 15:56:16 via Website

Ok, dann guck ich mir das auch nochmal ausführlich(er) an. Allerdings muss ich, hab ich festgestellt, hierfür ein paar Änderungen an meinem Sourcecode vornehmen, damit dieser leichter zu ändern geht. Egal...is ja alles Hobby und ich hab Zeit ;)

N'y pas n'y
tu car tu
mal tu mal

Antworten
  • Forum-Beiträge: 690

20.04.2016, 20:57:48 via Website

Schön gedacht. Aber jetzt kämpfe ich mit Gson. Mehr dazu im neuen Thread - die eigentliche Frage ist ja beantwortet.

N'y pas n'y
tu car tu
mal tu mal

Antworten

Empfohlene Artikel