XML sax parser, kann nicht alles parsern

  • Antworten:26
  • Bentwortet
Kinq__#
  • Forum-Beiträge: 47

16.06.2014, 18:48:48 via Website

Hey Leute

Ich habe ein Problem, Ich parse eine XML von meinem Webspace über SAX auf Android

<questions> <question><titel>blubbla</titel><r_answer>blabla</r_answer>......</question></questions>

Ich habe UTF-8 Encoding drauf, wenn ich jedoch dies anzeige, also die einzelnen childs, kommen nur einteil vom Text wenn ich es erneut lade kommt ein wenig mehr oder auch weniger. Weiss jemand eine Lösung zum Problem? Habe schon sehr viele Seiten durch gelese/probiert aber nix hat gebracht :(

Hoffe jemand kann mir Weiter helfen, falls ihr code stücke braucht bitte schreiben :)

Antworten
Kinq__#
  • Forum-Beiträge: 47

16.06.2014, 19:49:15 via Website

Pascal P.

Ich habe hiermit ( http://vichargrave.com/xml-creation-with-dom-in-java/ ) einen funktionierenden XML Reader gebaut

Das wäre dann mir DOM, will es aber mit SAX umsetzen. Aber danke dir für den Link :)

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

16.06.2014, 20:21:33 via Website

Warum dann?
Ist das nicht egal solange du das richtige Ergebnis bekommst?
Außerdem finde ich es mit DOM einfacher als mit SAX

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

Antworten
Kinq__#
  • Forum-Beiträge: 47

16.06.2014, 20:29:00 via Website

Also ich kann den felher schon weiter "einzäunen" bei den letzten xml daten wird einfach eine datei in 2 geteilt

LogCat:

1 letzter
06-16 20:21:34.108: I/System.out(14291): parsingTitle : In welchem Film hat Johnny Depp nicht mitgespielt?
06-16 20:21:34.108: I/System.out(14291): parsinganswer1 : Edward mit den Scherenhänden
06-16 20:21:34.108: I/System.out(14291): parsinganswer2 : Sleepy Hollow
06-16 20:21:34.108: I/System.out(14291): parsinganswer3 : Corpse Bride
06-16 20:21:34.108: I/System.out(14291): parsinganswer4 : Shutter Island

Letzter
06-16 20:21:34.108: I/System.out(14291): parsingTitle : Von wem wird der rosarote Panther ge <---------- Wird unterbrochen
06-16 20:21:34.113: I/System.out(14291): parsingTitle : jagt? <---------- Soll oben sein
06-16 20:21:34.113: I/System.out(14291): parsinganswer1 : Hercule Poirot
06-16 20:21:34.113: I/System.out(14291): parsinganswer2 : Sam Spade
06-16 20:21:34.113: I/System.out(14291): parsinganswer3 : Sherlock Holmes
06-16 20:21:34.113: I/System.out(14291): parsinganswer4 : Inspektor Clouseau

Hier der Code zum auslesen

@Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if (&quot;question&quot;.equalsIgnoreCase(qName)) {
            currentItem = new XmlItem();
        } else if (&quot;question_id_db&quot;.equalsIgnoreCase(qName)) {
            parsingid = true;
        } else if (&quot;question_title&quot;.equalsIgnoreCase(qName)) {
            parsingTitle = true;
        } else if (&quot;ranswer&quot;.equalsIgnoreCase(qName)) {
            parsingranswer = true;
        } else if (&quot;answer1&quot;.equalsIgnoreCase(qName)) {
            parsinganswer1 = true;
        } else if (&quot;answer2&quot;.equalsIgnoreCase(qName)) {
            parsinganswer2 = true;
        } else if (&quot;answer3&quot;.equalsIgnoreCase(qName)) {
            parsinganswer3 = true;
        } else if (&quot;answer4&quot;.equalsIgnoreCase(qName)) {
            parsinganswer4 = true;
        } else if (&quot;time&quot;.equalsIgnoreCase(qName)) {
            parsingtime = true;
        } else if (&quot;diff&quot;.equalsIgnoreCase(qName)) {
            parsingdiff = true;
        }
    }
    /*
     * (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
     */
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (parsingTitle) {
            if (currentItem != null) {
                System.out.println(&quot;parsingTitle : &quot; + new String(ch, start, length));  
                currentItem.setQuestionT(new String(ch, start, length));
            }
        } else if (parsinganswer1) {
            if (currentItem != null) {
                System.out.println(&quot;parsinganswer1 : &quot; + new String(ch, start, length));  
                currentItem.setAnswer1(new String(ch, start, length));
            }
        } else if (parsinganswer2) {
            if (currentItem != null) {
                System.out.println(&quot;parsinganswer2 : &quot; + new String(ch, start, length));  
                currentItem.setAnswer2(new String(ch, start, length));
            }
        } else if (parsinganswer3) {
            if (currentItem != null) {
                System.out.println(&quot;parsinganswer3 : &quot; + new String(ch, start, length));  
                currentItem.setAnswer3(new String(ch, start, length));
            }
        } else if (parsinganswer4) {
            if (currentItem != null) {
                System.out.println(&quot;parsinganswer4 : &quot; + new String(ch, start, length));  
                currentItem.setAnswer4(new String(ch, start, length));
            }
        } else if (parsingtime) {
            if (currentItem != null) {
                currentItem.setTime(new String(ch, start, length));

            }
        } else if (parsingranswer) {
            if (currentItem != null) {
                currentItem.setRanswer(new String(ch, start, length));

            }
        } else if (parsingdiff) {
            if (currentItem != null) {
                currentItem.setDiff(new String(ch, start, length));

            }
        } else if (parsingid) {
            if (currentItem != null) {
                currentItem.setId(new String(ch, start, length));

            }
        }
    }
    /*
     * (non-Javadoc)
     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
     */
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (&quot;question&quot;.equalsIgnoreCase(qName)) {
            rssItems.add(currentItem);
            currentItem = null;
        } else if (&quot;question_id_db&quot;.equalsIgnoreCase(qName)) {
            parsingid = false;
        } else if (&quot;question_title&quot;.equalsIgnoreCase(qName)) {
            parsingTitle = false;
        } else if (&quot;ranswer&quot;.equalsIgnoreCase(qName)) {
            parsingranswer = false;
        } else if (&quot;answer1&quot;.equalsIgnoreCase(qName)) {
            parsinganswer1 = false;
        } else if (&quot;answer2&quot;.equalsIgnoreCase(qName)) {
            parsinganswer2 = false;
        } else if (&quot;answer3&quot;.equalsIgnoreCase(qName)) {
            parsinganswer3 = false;
        } else if (&quot;answer4&quot;.equalsIgnoreCase(qName)) {
            parsinganswer4 = false;
        } else if (&quot;time&quot;.equalsIgnoreCase(qName)) {
            parsingtime = false;
        } else if (&quot;diff&quot;.equalsIgnoreCase(qName)) {
            parsingdiff = false;
        }
    }

Antworten
Kinq__#
  • Forum-Beiträge: 47

16.06.2014, 22:44:20 via Website

Habe jetzt zich Anleitungeng durchprobiert.... leider bin ich zu kein Ergebniss gekomment :( hoffe jemand kann mich doch noch weiter helfen

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

17.06.2014, 08:08:27 via App

Wieso musst du das mit SAX machen?
Versuch es doch einmal anders oder ist das eine Vrogqbe in irgendeiner Art?

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

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

17.06.2014, 08:11:01 via App

Kinq__#

Habe jetzt zich Anleitungeng durchprobiert.... leider bin ich zu kein Ergebniss gekomment :( hoffe jemand kann mich doch noch weiter helfen

wie Holst du das XML offline oder über ben Server?

wenn du über ben Server holst dann poste mal die Methode.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Kinq__#
  • Forum-Beiträge: 47

17.06.2014, 17:43:29 via Website

Ludy

Kinq__#

Habe jetzt zich Anleitungeng durchprobiert.... leider bin ich zu kein Ergebniss gekomment :( hoffe jemand kann mich doch noch weiter helfen

wie Holst du das XML offline oder über ben Server?

wenn du über ben Server holst dann poste mal die Methode.

ublic class XmlReader {

private String rssUrl;

/**
* Constructor
*
* @param rssUrl
*/
public XmlReader(String rssUrl) {
this.rssUrl = rssUrl;
}

/**
* Get RSS items.
*
* @return
*/
public List&lt;XmlItem&gt; getItems() throws Exception {
// SAX parse RSS data
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

XmlParseHandler handler = new XmlParseHandler();
InputSource is = new InputSource(rssUrl);
is.setEncoding(&quot;UTF-8&quot;);
saxParser.parse(rssUrl, handler);

return handler.getItems();

}

}

Es wird über eine asynctask auf die classe XmlReader zugegfriffen

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

17.06.2014, 21:06:49 via Website

Kinq__#

Ludy

Kinq__#

Habe jetzt zich Anleitungeng durchprobiert.... leider bin ich zu kein Ergebniss gekomment :( hoffe jemand kann mich doch noch weiter helfen

wie Holst du das XML offline oder über ben Server?

wenn du über ben Server holst dann poste mal die Methode.

ublic class XmlReader {

private String rssUrl;

/**
* Constructor
*
* @param rssUrl
*/
public XmlReader(String rssUrl) {
this.rssUrl = rssUrl;
}

/**
* Get RSS items.
*
* @return
*/
public List<XmlItem> getItems() throws Exception {
// SAX parse RSS data
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();

XmlParseHandler handler = new XmlParseHandler();
InputSource is = new InputSource(rssUrl);
is.setEncoding("UTF-8";);
saxParser.parse(rssUrl, handler);

return handler.getItems();

}

}

Es wird über eine asynctask auf die classe XmlReader zugegfriffen

Das war zwar nicht die Frage von mir, aber egal.

InputSource is = new InputSource(rssUrl);
is.setEncoding("UTF-8";);

was soll das werden? Du übergibts den inputSource nicht, also nutzlos.

ich meinte solch eine Methode

URL url = new URL(
                    &quot;http://deine.url.xy&quot;);
            HttpURLConnection conn = (HttpURLConnection) url
                    .openConnection();
            in = conn.getInputStream();
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            for (int count; (count = in.read(buffer)) != -1; ) {
                out.write(buffer, 0, count);
            }
            byte[] response = out.toByteArray();
            rssFeed = new String(response, &quot;UTF-8&quot;);

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Kinq__#
  • Forum-Beiträge: 47

19.06.2014, 10:27:04 via Website

private class GetRSSDataTask extends AsyncTask<String, Void, List<XmlItem> > {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MultiPlay.this);
pDialog.setMessage(getResources().getString(R.string.dialog_loadquest_msg));;
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}

    @Override
    protected List&lt;XmlItem&gt; doInBackground(String... urls) {
        for (int i = 0; i &lt;= 1; i++) {
            try {
                // Create RSS reader
                XmlReader rssReader = new XmlReader(urls[0]);

                // Parse RSS, get items
                result = rssReader.getItems();
                System.out.println(&quot;Resultat von async : &quot; + result);  
                return result;

            } catch (Exception e) {
                Log.e(&quot;ITCRssReader&quot;, e.getMessage());
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(List&lt;XmlItem&gt; sample_return) {
        pDialog.dismiss();

        //Button mit den Antwortm&ouml;glichkeite f&uuml;llen
        GetNewQuestioin(0);
    }
 }

Antworten
Kinq__#
  • Forum-Beiträge: 47

19.06.2014, 15:52:56 via Website

Ludy

und wo wird dein InputSource über gegen?

InputSource is = new InputSource(rssUrl);
is.setEncoding(&quot;UTF-8&quot;;);
saxParser.parse(is, handler);

Der obige code

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

19.06.2014, 17:19:21 via App

Kinq__#

Ludy

und wo wird dein InputSource über gegen?

InputSource is = new InputSource(rssUrl);
is.setEncoding(&quot;UTF-8&quot;;);
saxParser.parse(is, handler);

Der obige code

dein code war aber dieser

XmlParseHandler handler = new XmlParseHandler();
InputSource is = new InputSource(rssUrl);
is.setEncoding("UTF-8";);
saxParser.parse(rssUrl, handler);

Also was ist jetzt richtig?

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Kinq__#
  • Forum-Beiträge: 47

20.06.2014, 11:55:28 via Website

Bei saxParser.parse(is, handler); ist richtig hatte vergessen zu erwähnen das ich es geändert habe sorry:angel:

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

20.06.2014, 15:22:06 via App

Schau mal hier vorbei vielleicht hilf es: http://theopentutorials.com/tutorials/android/xml/android-simple-xml-sax-parser-tutorial/

— geändert am 20.06.2014, 19:56:52

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Kinq__#
  • Forum-Beiträge: 47

21.09.2014, 12:02:01 via Website

Jetzt habe ich ein Bild für euch, habe bis heute das problem nicht lösen können, ich will das Problem lösen um mich zuverbessern.
man kann sehen das es "ter die Erde auf?" steht soll aber "Wer räumt als letzter die Erde auf?" heissen. Im Logcat steht folgendes

09-21 11:54:43.074: I/System.out(12196): parsingTitle : Wer räumt als letz <-Wird
09-21 11:54:43.079: I/System.out(12196): parsingTitle : ter die Erde auf? <- unterbrochen
09-21 11:54:43.079: I/System.out(12196): parsinganswer1 : WALL-E
09-21 11:54:43.079: I/System.out(12196): parsinganswer2 : Herbert Feuerstein
09-21 11:54:43.079: I/System.out(12196): parsinganswer3 : Flint Lockwood
09-21 11:54:43.079: I/System.out(12196): parsinganswer4 : Die Jetsons

image

Antworten
Andy N.
  • Forum-Beiträge: 3.112

21.09.2014, 16:51:26 via App

Das ist normal. Die characters-Methode gibt den Wert manchmal in Stücken wieder. Du musst den String der Methode wieder zusammen bauen.

— geändert am 21.09.2014, 16:51:45

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.09.2014, 17:28:07 via App

Hatte mit SAX auch so meine Probleme etc. bin dann auf einen Dom xml Parser umgestiegen.
Theoretisch kannst du die beiden Teilstrings auch wieder zusammenfügen also das Sax Problem mit deinem Code beheben.

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

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

21.09.2014, 17:40:08 via App

Pascal P.

Hatte mit SAX auch so meine Probleme etc. bin dann auf einen Dom xml Parser umgestiegen.
Theoretisch kannst du die beiden Teilstrings auch wieder zusammenfügen also das Sax Problem mit deinem Code beheben.

Komisch meine App hab ich in der nächsten Version nur mit SAX ohne Probleme in der beta.

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

21.09.2014, 17:43:32 via App

@Ludy: Kann auch sein, dass ich einfach den Code falsch benutzt/verstanden habe und es deswegen nicht getan hat. Ich bin nun mit der Dom version zufrieden. Gibt es eigentlich gravierende Unterschiede in der Funktionsweise von dom und sax?

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

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

21.09.2014, 18:02:37 via Website

Pascal P.

@Ludy: Kann auch sein, dass ich einfach den Code falsch benutzt/verstanden habe und es deswegen nicht getan hat. Ich bin nun mit der Dom version zufrieden. Gibt es eigentlich gravierende Unterschiede in der Funktionsweise von dom und sax?

Fand DOM zu unübersichtlich daher SAX

— geändert am 28.09.2014, 09:43:35

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Andy N.
  • Forum-Beiträge: 3.112

21.09.2014, 18:48:15 via App

Ludy

Komisch meine App hab ich in der nächsten Version nur mit SAX ohne Probleme in der beta.

Mag sein, dass es noch nie zu einem Fehler geführt hat, dennoch ist das so und beachtet man das nicht ist der Code fehlerhaft. Siehe dazu die Doku:

http://developer.android.com/reference/org/xml/sax/ContentHandler.html

Antworten
Ludy
  • Admin
  • Forum-Beiträge: 7.960

21.09.2014, 18:59:20 via App

Andy N.

Ludy

Komisch meine App hab ich in der nächsten Version nur mit SAX ohne Probleme in der beta.

Mag sein, dass es noch nie zu einem Fehler geführt hat, dennoch ist das so und beachtet man das nicht ist der Code fehlerhaft. Siehe dazu die Doku:

http://developer.android.com/reference/org/xml/sax/ContentHandler.html

Denn hab ich wohl mal was richtig gemacht ;-)

Gruß Ludy (App Entwickler)

Mein Beitrag hat dir geholfen? Lass doch ein "Danke" da.☺

☕ Buy Me A Coffee ☕

Lebensmittelwarnung-App

✨Meine Wunschliste✨

📲Telegram NextPit News📲

Antworten
Kinq__#
  • Forum-Beiträge: 47

04.10.2014, 09:30:10 via Website

Ich bedanke mich bei euch! :* hab es geschaft mit den Beiträgen mein Problem zulösen.
Ich habe folgendes getan:

private StringBuffer buffer = new StringBuffer();

in endElement -> buffer = new StringBuffer();
in characters -> StringBuffer strb = buffer.append(new String(ch, start, length));

nun werden die einzelteile erfolgreich zusamen geführt :D

LG

Antworten