Android org.xmlpull.v1.XmlPullParserException beim Parsen von XML

Ich habe eine Situation, in der ich einen Webdienst anrufe und er mir HTML in einem XML-Umschlag zurückgibt. mögen:

<code><xml version="1.0" cache="false">
<head/>
<body>
<table>
<tr>
   <td>
        <a href="link-to-prev-post">
           <text color="red"><< Prev</text>
        </a>
   </td>
   <td>
        <a href="link-to-next-post">
           <text color="red">| Next >></text>
        </a>
   </td>
</tr>
</table>
</body>
</xml>
</code>

Ich muss das abrufenlink-to-prev-post & link-zum-nächsten-post Links .. damit ich mehr Daten über diese Links bekommen kann.

ich benutzeXmlPullParser um das oben angegebene XML / HTML zu analysieren. Um die Links für die nächsten / vorherigen Artikel zu erhalten, gehe ich wie folgt vor:

<code>if (xmlNodeName.equalsIgnoreCase("a")) {
                link = parser.getAttributeValue(null, "href");

            } else if (xmlNodeName.equalsIgnoreCase("text")) {
                color = parser.getAttributeValue(null, "color");

                if (color.equalsIgnoreCase("red") && parser.getEventType() == XmlPullParser.START_TAG) {
                        // check for next/prev blog entries links
                        // but this parser.nextText() throws XmlPullParserException
                        // i think because the nextText() returns << Prev which the parser considers to be wrong
                        String innerText = parser.nextText();
                        if (innerText.contains("<< Prev")) {
                            blog.setPrevBlogItemsUrl(link);                             
                        } else if (innerText.contains("Next >>")) {
                            blog.setNextBlogItemsUrl(link);
                        }
                    }

                    link = null;
                }
            }
</code>

Es wirftXmlPullParserException bei Ausführung vonparser.nextText () ... und der Wert des Textelements zu diesem Zeitpunkt ist<< Zurück Ich denke, es missversteht diesen Wert mit Start-Tag wegen des Vorhandenseins von<< im Text..

LogCat-Detail ist:

<code>04-08 18:32:09.827: W/System.err(688): org.xmlpull.v1.XmlPullParserException: precondition: START_TAG (position:END_TAG </text>@9:2535 in java.io.InputStreamReader@44c6d0d8) 
04-08 18:32:09.827: W/System.err(688):  at org.kxml2.io.KXmlParser.exception(KXmlParser.java:245)
04-08 18:32:09.827: W/System.err(688):  at org.kxml2.io.KXmlParser.nextText(KXmlParser.java:1382)
04-08 18:32:09.827: W/System.err(688):  at utilities.XMLParserHelper.parseBlogEntries(XMLParserHelper.java:139)
04-08 18:32:09.827: W/System.err(688):  at serviceclients.PlayerSummaryAsyncTask.doInBackground(PlayerSummaryAsyncTask.java:68)
04-08 18:32:09.827: W/System.err(688):  at serviceclients.PlayerSummaryAsyncTask.doInBackground(PlayerSummaryAsyncTask.java:1)
04-08 18:32:09.836: W/System.err(688):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-08 18:32:09.836: W/System.err(688):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-08 18:32:09.836: W/System.err(688):  at java.lang.Thread.run(Thread.java:1096)
</code>

Ich hoffe ich habe mein Problem geklärt.

Lösung

Isnpired vonMartins Ansatz der Konvertierung der empfangenen Daten zuerst in Zeichenfolge, ich habe mein Problem in einer Art gemischten Ansatz verwaltet.

Konvertieren Sie die empfangenenEingabestromDer Wert für string und das Ersetzen der fehlerhaften Zeichen durch * (oder was auch immer Sie wünschen): wie folgt

<code>InputStreamReader isr = new InputStreamReader(serviceReturnedStream);

BufferedReader br = new BufferedReader(isr);
StringBuilder xmlAsString = new StringBuilder(512);
String line;
try {
    while ((line = br.readLine()) != null) {
        xmlAsString.append(line.replace("<<", "*").replace(">>", "*"));
    }
} catch (IOException e) {
    e.printStackTrace();
}
</code>

Jetzt habe ich eine Zeichenfolge, die korrekte XML-Daten enthält (für meinen Fall). Verwenden Sie also einfach den normalen XmlPullParser, um sie zu analysieren, anstatt sie selbst manuell zu analysieren:

<code>XmlPullParserFactory factory = XmlPullParserFactory.newInstance();

factory.setNamespaceAware(false);

XmlPullParser parser = factory.newPullParser();
parser.setInput(new StringReader(xmlAsString.toString()));
</code>

Hoffe das hilft jemandem!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage