XML sax parser, kann nicht alles parsern

  • Antworten:26
  • OffenNicht stickyBentwortet
  • 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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.171

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
  • 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
  • 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.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.171

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
  • Mod
  • Blogger
  • Forum-Beiträge: 7.164

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Antworten
  • 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
  • Mod
  • Blogger
  • Forum-Beiträge: 7.164

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Antworten
  • 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
  • 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
  • Mod
  • Blogger
  • Forum-Beiträge: 7.164

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.☺

Lebensmittelwarnung App-Thread

Download Samsung Firmware Tool

Antworten
  • 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
  • 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
  • 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

Empfohlene Artikel