Android, XML ошибка при парсинге, универсальный парсер
Добавлено: 17 дек 2013, 18:19
У меня возникла проблема при парсинге (xmlPullParser), выдает ошибку, лог:
Вызов:
Сам код:
Класс XmlDownload:
XML - сообщение которое получаю от сервера:
Не пойму в чем дело, до этого работало когда-то, пока не поменял структуру сайта.
И еще вопрос, можно ли как-то все это сделать более универсальным, например чтобы создавать экземпляр XmlDownload, в которые вернется объект со свойствами {field1:val,field2:val, ...}, где каждое field - будет соответствовать тэгу в XML-сообщение, так хочется сделать чтобы для каждого activity и каждого скрипта на сервере не лепить собственный processRecivedData(), можно ли так?
Код: Выделить всё
12-17 17:10:08.355: W/System.err(28761): org.xmlpull.v1.XmlPullParserException: Unexpected token (position:TEXT @1:2 in java.io.InputStreamReader@428a04b8)
12-17 17:10:08.365: W/System.err(28761): at org.kxml2.io.KXmlParser.next(KXmlParser.java:426)
12-17 17:10:08.365: W/System.err(28761): at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
12-17 17:10:08.365: W/System.err(28761): at ru.homeandroid.MainActivity$XMLDownloader.processRecivedData(MainActivity.java:192)
12-17 17:10:08.370: W/System.err(28761): at ru.homeandroid.XmlDownload.tryParsingXmlData(XmlDownload.java:53)
12-17 17:10:08.370: W/System.err(28761): at ru.homeandroid.XmlDownload.doInBackground(XmlDownload.java:29)
12-17 17:10:08.370: W/System.err(28761): at ru.homeandroid.XmlDownload.doInBackground(XmlDownload.java:1)
12-17 17:10:08.370: W/System.err(28761): at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-17 17:10:08.370: W/System.err(28761): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
12-17 17:10:08.370: W/System.err(28761): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-17 17:10:08.370: W/System.err(28761): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
12-17 17:10:08.370: W/System.err(28761): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
12-17 17:10:08.370: W/System.err(28761): at java.lang.Thread.run(Thread.java:841)
Код: Выделить всё
XMLDownloader downloader = new XMLDownloader("http://server.ru/script.php");
downloader.execute(); Код: Выделить всё
class XMLDownloader extends XmlDownload{
public XMLDownloader(String url) { //construct
super(url);
}
public String TAG="MyLog";
void processRecivedData(XmlPullParser xmlData) throws XmlPullParserException, IOException {
int eventType = -1;
int recordsFound = 0;
String tagName = "", login = "", pass = "", status = "";
while(eventType!=XmlResourceParser.END_DOCUMENT)
{
switch(eventType)
{
case XmlResourceParser.START_TAG:
tagName=xmlData.getName();
Log.d(TAG, "Text_TAGNAME: <"+tagName+">");
break;
case XmlResourceParser.TEXT:
Log.d(TAG, "Text_TAGNAME: <"+tagName+">"+xmlData.getText()+"</"+tagName+">");
if(TextUtils.equals(tagName,"login")) {login = xmlData.getText(); }
if(TextUtils.equals(tagName,"pass")) { pass = xmlData.getText();}
if(TextUtils.equals(tagName,"status")) {status = xmlData.getText(); }
break;
case XmlResourceParser.END_TAG:
recordsFound++;
tagName = "";
if ("item".equals(xmlData.getName())) {
publishProgress(login, pass, status);
}
break;
default: break;
}
eventType=xmlData.next();
if(recordsFound==0){
publishProgress();
}
}
}
@Override
protected void onProgressUpdate(String... values){
if(values.length>1)
{
String login = values[0], pass = values[1], status = values[2];
MainActivity.this.checkOutOfSever(login,pass,status);
}
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Integer result) { //действие после полной загрузки XML
}
}Код: Выделить всё
public abstract class XmlDownload extends AsyncTask<Object, String, Integer>{
private String serverRequest;
public XmlDownload(String url){
serverRequest=url;
}
@Override
protected Integer doInBackground(Object... params) {
XmlPullParser recivedData = null;
try {
recivedData = tryDownloadingXmlData();
} catch (IOException e) { e.printStackTrace(); }
int recordsFound = 0;
try {
recordsFound = tryParsingXmlData(recivedData);
} catch (XmlPullParserException e) { e.printStackTrace(); }
catch (IOException e) { e.printStackTrace(); }
return recordsFound;
}
private XmlPullParser tryDownloadingXmlData() throws IOException {
try{
URL xmlUrl = new URL(serverRequest);
XmlPullParser recivedData = XmlPullParserFactory.newInstance().newPullParser();
recivedData.setInput(xmlUrl.openStream(),"UTF8");
return recivedData;
}
catch(XmlPullParserException e){ }
catch(IOException e) { }
return null;
}
private int tryParsingXmlData(XmlPullParser recivedData) throws XmlPullParserException, IOException {
if(recivedData != null)
{
processRecivedData(recivedData);
}
return 0;
}
abstract void processRecivedData(XmlPullParser xmlData) throws XmlPullParserException, IOException;
}
Код: Выделить всё
<?xml version="1.0" encoding="utf-8" ?>
<message>
<item>
<login>sanu0074</login>
<pass>pwd1</pass>
<status>ok_1</status>
</item>
</message>И еще вопрос, можно ли как-то все это сделать более универсальным, например чтобы создавать экземпляр XmlDownload, в которые вернется объект со свойствами {field1:val,field2:val, ...}, где каждое field - будет соответствовать тэгу в XML-сообщение, так хочется сделать чтобы для каждого activity и каждого скрипта на сервере не лепить собственный processRecivedData(), можно ли так?