XmlPullParser неправильно получает значения

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

XmlPullParser неправильно получает значения

Сообщение sanu0074 » 16 июл 2013, 10:02

Здравствуйте. Пытаюсь написать обработку XML сообщения от сервера, получить правильно данные (ссылку на изображение и имя), загрузить изображение в ImageView и имя в TextView, все это создаваться будет динамически.
Все работает если отдельно получать имя и ссылку на картинку, а вот если вместе, то возник косяк, приложение вылетает после запуска, вот такое XML сообщение:

Код: Выделить всё

<item>
	<lnk>http://home-android.ru/content/games/290/1362551973778339B.jpg</lnk>
	<name>Subway Surfers</name>
</item>
<item>
	<lnk>http://home-android.ru/content/games/903/13694796854695B.png</lnk>
	<name>Ultimate Stick Fight</name>
</item>
И вот то что я накодил:

Код: Выделить всё

package com.t.test; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 
 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.res.XmlResourceParser; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.util.Log; 
import android.widget.ImageView; 
import android.widget.LinearLayout;
import android.widget.TextView; 
 
public class Main extends Activity { 
 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

         
        AsyncDownloader downloader = new AsyncDownloader(); 
        downloader.execute();  
    }  
     
    public void rec(String lnk, String name) 
    { 
    	 LinearLayout layout = (LinearLayout) findViewById(R.id.lin1);
    	 
         TextView txt = new TextView(this); 
         txt.setText(name); 
         layout.addView(txt);
         
         ImageView image = new ImageView(this);
         layout.addView(image);
         new DownloadImageTask(image).execute(lnk);
    } 
     
     
    class AsyncDownloader extends AsyncTask<Object, String, Integer>{ 
 
        @Override 
        protected Integer doInBackground(Object... params) { 
             
            XmlPullParser recivedData = null; 
            try { 
                recivedData = tryDownloadingXmlData(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            int recordsFound = 0; 
            try { 
                recordsFound = tryParsingXmlData(recivedData); 
            } catch (XmlPullParserException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            return recordsFound; 
        } 
         
        private XmlPullParser tryDownloadingXmlData() throws IOException {     
            try{ 
            URL xmlUrl = new URL("http://home-android.ru/android/main"); 
            XmlPullParser recivedData = XmlPullParserFactory.newInstance().newPullParser(); 
            recivedData.setInput(xmlUrl.openStream(),null); 
            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; 
        } 
 
 
 
        private void processRecivedData(XmlPullParser xmlData) throws XmlPullParserException, IOException { 
            int eventType = -1; 
            int recordsFound = 0; 
             
            String lnk=""; 
            String name=""; 
             
             
            while(eventType!=XmlResourceParser.END_DOCUMENT) 
            { 
                String tagName=xmlData.getName(); 
                switch(eventType) 
                { 
                case XmlResourceParser.START_TAG: 
                    if(xmlData.getText()!=null && tagName.equals("item")) 
                    { 
                    	continue;
                    } 
                break; 
                 
                case XmlResourceParser.TEXT: 
                	if (tagName.equals("lnk")) {
                    lnk=xmlData.getText(); 
                	}
                    if (tagName.equals("name")) {
                    	name = xmlData.getText();
                    }
                break; 
                 
                 
                case XmlResourceParser.END_TAG: 
                    if(tagName.equals("item")) 
                    { 
                        recordsFound++; 
                        publishProgress(lnk,name); 
                    } 
                break; 
                } 
                eventType=xmlData.next(); 
                 
                if(recordsFound==0){ 
                    publishProgress(); 
                } 
            } 
             
             
             
        } 
 
         
        @Override 
        protected void onPostExecute(Integer result) { 
            super.onPostExecute(result); 
            //  код 
        } 
         
 
 
        @Override 
        protected void onProgressUpdate(String... values){ 
             
            if(values.length>1) 
            { 
                String lnk = values[0]; 
                String name = values[1];
                 
                	Main.this.rec(lnk,name); 
                 
            }
             
            super.onProgressUpdate(values); 
        } 
         
         
    }     
    
    
    
    
    
     
    class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
        ImageView bmImage; 
 
        DownloadImageTask(ImageView bmImage) { 
            this.bmImage = bmImage; 
        } 
 
        protected Bitmap doInBackground(String... urls) { 
            String urldisplay = urls[0]; 
            Bitmap mIcon11 = null; 
            try { 
                InputStream in = new java.net.URL(urldisplay).openStream(); 
                mIcon11 = BitmapFactory.decodeStream(in); 
            } catch (Exception e) { 
                Log.e("Error", e.getMessage()); 
                e.printStackTrace(); 
            } 
            return mIcon11; 
        } 
 
        protected void onPostExecute(Bitmap result) { 
            bmImage.setImageBitmap(result); 
        } 
    } 
     
         
} 

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: XmlPullParser неправильно получает значения

Сообщение sanu0074 » 16 июл 2013, 23:58

Вот переписал его так:

Код: Выделить всё

package com.t.test; 
 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
 
import org.xmlpull.v1.XmlPullParser; 
import org.xmlpull.v1.XmlPullParserException; 
import org.xmlpull.v1.XmlPullParserFactory; 
 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.res.XmlResourceParser; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.text.TextUtils;
import android.util.Log; 
import android.widget.ImageView; 
import android.widget.LinearLayout;
import android.widget.TextView; 
 
public class Main extends Activity { 
	 
	public String TAG="MyLog";
	
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        
        setContentView(R.layout.main); 
        
        Log.d(TAG, "strat app TEST");
        
        AsyncDownloader downloader = new AsyncDownloader(); 
        
        Log.d(TAG, "AsyncDownloader");
        
        downloader.execute();  
        
        Log.d(TAG, "Execute AD");
    }  
     
    public void rec(String lnk, String name) 
    { 
    	 LinearLayout layout = (LinearLayout) findViewById(R.id.lin1);
    	 
         TextView txt = new TextView(this); 
         txt.setText(name); 
         layout.addView(txt);
         
         //ImageView image = new ImageView(this);
         //layout.addView(image);
        // new DownloadImageTask(image).execute(lnk);
    } 
     
     
    class AsyncDownloader extends AsyncTask<Object, String, Integer>{ 
 
    	public String TAG="MyLog";
    	
        @Override 
        protected Integer doInBackground(Object... params) { 
             
            XmlPullParser recivedData = null; 
            try { 
                recivedData = tryDownloadingXmlData(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            int recordsFound = 0; 
            try { 
                recordsFound = tryParsingXmlData(recivedData); 
            } catch (XmlPullParserException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } catch (IOException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
            return recordsFound; 
        } 
          
        private XmlPullParser tryDownloadingXmlData() throws IOException {     
            try{ 
            URL xmlUrl = new URL("http://home-android.ru/android/main"); 
            XmlPullParser recivedData = XmlPullParserFactory.newInstance().newPullParser(); 
            recivedData.setInput(xmlUrl.openStream(),null); 
            
            Log.d(TAG, "XML получен");
            
            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; 
        } 
 
 
 
        private void processRecivedData(XmlPullParser xmlData) throws XmlPullParserException, IOException { 
            int eventType = -1; 
            int recordsFound = 0; 
             
            String lnk=""; 
            String name=""; 
            
            Log.d(TAG, "Старт парсинга XML");
             
            while(eventType!=XmlResourceParser.END_DOCUMENT) 
            { 
                String tagName=xmlData.getName(); 
                
                switch(eventType)  
                { 
                	case XmlResourceParser.START_TAG: 
                	Log.d(TAG, "START_TAG: name = " + xmlData.getName());     
                	break; 
                 

                  // содержимое тэга
                case XmlResourceParser.TEXT:
                	  
                		  
                          if(TextUtils.equals(tagName,"name")) {
                        	  name = xmlData.getText();  Log.d(TAG, "Text = " + xmlData.getText());
                          }
                          if(TextUtils.equals(tagName,"lnk")) {
                        	  lnk = xmlData.getText();   Log.d(TAG, "Text = " + xmlData.getText());
                          }
                          
                    break;

                  case XmlResourceParser.END_TAG:
                      Log.d(TAG, "END_TAG: name = " + xmlData.getName());
                      Log.d(TAG, "publishProgress: name = " +name+ "; lnk = " + lnk);
                      recordsFound++; 
                     publishProgress(lnk,name); 
                      
                      break;
                
                

                  default:  break;
                    

                } 
                eventType=xmlData.next(); 
                 
                if(recordsFound==0){ 
                    publishProgress(); 
                } 
            } 
             
             
             
        } 
 
         
        @Override 
        protected void onPostExecute(Integer result) { 
            super.onPostExecute(result); 
            //  код 
        } 
         
 
 
        @Override 
        protected void onProgressUpdate(String... values){ 
             
            if(values.length>1) 
            { 
                String lnk = values[0]; 
                String name = values[1];
                 
                	Main.this.rec(lnk,name); 
                 
            }
             
            super.onProgressUpdate(values); 
        } 
         
         
    }     
    
    
    
    
    
     
    class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
        ImageView bmImage; 
 
        DownloadImageTask(ImageView bmImage) { 
            this.bmImage = bmImage; 
        } 
 
        protected Bitmap doInBackground(String... urls) { 
            String urldisplay = urls[0]; 
            Bitmap mIcon11 = null; 
            try { 
                InputStream in = new java.net.URL(urldisplay).openStream(); 
                mIcon11 = BitmapFactory.decodeStream(in); 
            } catch (Exception e) { 
                Log.e("Error", e.getMessage()); 
                e.printStackTrace(); 
            } 
            return mIcon11; 
        } 
 
        protected void onPostExecute(Bitmap result) { 
            bmImage.setImageBitmap(result); 
        } 
    } 
     
         
} 
Вот лог:

Код: Выделить всё

07-16 19:44:53.018: E/Trace(9678): error opening trace file: No such file or directory (2)
07-16 19:44:53.398: D/MyLog(9678): strat app TEST
07-16 19:44:53.398: D/MyLog(9678): AsyncDownloader
07-16 19:44:53.398: D/MyLog(9678): Execute AD
07-16 19:44:53.488: D/gralloc_goldfish(9678): Emulator without GPU emulation detected.
07-16 19:44:54.348: D/MyLog(9678): XML получен
07-16 19:44:54.348: D/MyLog(9678): Старт парсинга XML
07-16 19:44:54.348: D/MyLog(9678): START_TAG: name = message
07-16 19:44:54.348: D/MyLog(9678): START_TAG: name = item
07-16 19:44:54.348: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:54.358: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:54.358: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:54.358: D/MyLog(9678): START_TAG: name = name
07-16 19:44:54.368: D/MyLog(9678): END_TAG: name = name
07-16 19:44:54.368: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:54.368: D/MyLog(9678): END_TAG: name = item
07-16 19:44:54.368: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:54.618: D/MyLog(9678): START_TAG: name = item
07-16 19:44:54.923: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.008: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.008: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.028: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.028: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.038: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.038: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.038: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.038: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.038: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.058: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.068: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.068: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.068: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.068: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.068: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.068: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.098: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.098: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.108: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.108: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.108: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.129: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.129: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.138: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.138: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.138: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.138: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.138: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.138: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.138: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.138: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.138: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.138: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.138: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.168: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.208: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.208: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.228: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.258: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.268: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.278: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.299: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.299: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.318: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.318: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.338: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.338: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.368: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.368: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.368: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.398: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.398: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.428: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.438: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.438: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.438: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.458: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.458: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.469: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.488: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.488: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.508: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.518: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.518: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.518: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.548: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.548: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.558: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.578: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.578: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.598: D/MyLog(9678): START_TAG: name = item
07-16 19:44:55.608: D/MyLog(9678): START_TAG: name = lnk
07-16 19:44:55.608: D/MyLog(9678): END_TAG: name = lnk
07-16 19:44:55.608: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.628: D/MyLog(9678): START_TAG: name = name
07-16 19:44:55.628: D/MyLog(9678): END_TAG: name = name
07-16 19:44:55.639: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.678: D/MyLog(9678): END_TAG: name = item
07-16 19:44:55.678: D/MyLog(9678): publishProgress: name = ; lnk = 
07-16 19:44:55.708: D/MyLog(9678): END_TAG: name = message
07-16 19:44:55.708: D/MyLog(9678): publishProgress: name = ; lnk = 
В переменных которые идут в publishProgress, ничего нет, непойму почему?

Я уже смотрел много примеров и перечитывал все по несколько раз, немогу понять, почему так переменные пустые:

Код: Выделить всё

if(TextUtils.equals(tagName,"name")) {
                        	  name = xmlData.getText();  Log.d(TAG, "Text = " + xmlData.getText());
                          }
                          if(TextUtils.equals(tagName,"lnk")) {
                        	  lnk = xmlData.getText();   Log.d(TAG, "Text = " + xmlData.getText());
                          }
А если просто оставить строку:

Код: Выделить всё

Log.d(TAG, "Text = " + xmlData.getText());
то в лог записываются нужные данные.....
Никак неразберусь((

wondertalik
Сообщения: 15
Зарегистрирован: 29 мар 2013, 10:15

Re: XmlPullParser неправильно получает значения

Сообщение wondertalik » 17 июл 2013, 00:40

Исходники не компилировал, но на первый взгляд вы судя по всему не правильно понимаете проход парсера по хмл и присваивание переменных name и lnk. Почитайте здесь, писал когда-то для себя, она под jme, но суть от этого не меняется. Потом сюда
Ответьте на вопросы: где сначала находится курсор, где он находится после вызова next(), какой следующий элемент, какие значения в этот момент присвоены переменным.
Подсказка:

Код: Выделить всё


                  case XmlResourceParser.END_TAG: 
                      Log.d(TAG, "END_TAG: name = " + xmlData.getName()); 
                      Log.d(TAG, "publishProgress: name = " +name+ "; lnk = " + lnk); 
                      recordsFound++;  
                     publishProgress(lnk,name); 
Почему Вы решили что в этот момент lnk и name обязательно имеют значения? А вообще сделайте рефакторинг класса. Все в куче. В этом случае будет проще пользоваться дебагером, предварительно разбив архитектуру на мелкие модули. Так проще отлавливать непонятки. Удачи.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: XmlPullParser неправильно получает значения

Сообщение Finch » 17 июл 2013, 00:48

Очень много лишнего кода аж голова разболелась, тут явно на лицо God object, я бы вообще регулярками сделал в 4 строчки и работало бы =)
CEO of a company R.id.team

Аватара пользователя
sanu0074
Сообщения: 80
Зарегистрирован: 30 июн 2013, 20:42
Контактная информация:

Re: XmlPullParser неправильно получает значения

Сообщение sanu0074 » 17 июл 2013, 09:04

wondertalik писал(а):какие значения в этот момент присвоены переменным.
Проблема в том, я заметил, что в переменныe lnk и name ничего не попадает еще на этом этапе:

Код: Выделить всё

 case XmlResourceParser.TEXT:  
                    if (tagName.equals("lnk")) { 
                    lnk=xmlData.getText();  
                    } 
                    if (tagName.equals("name")) { 
                        name = xmlData.getText(); 
                    } 
                break;  

Немогу понять почему, прбовал эту проверку делать разными способами...
Пробовал TextUtil.equals, и пробовал проверять на NULL... ничего не вышло....

Сделал, вот так:

Код: Выделить всё

          case XmlResourceParser.TEXT:	  
                          if(TextUtils.equals(tagName,"name")) {
                        	  name = xmlData.getText();  Log.d(TAG, "Text = " + xmlData.getText());
                          }
                          if(TextUtils.equals(tagName,"lnk")) {
                        	  lnk = xmlData.getText();   Log.d(TAG, "Text = " + xmlData.getText());
                          }
                  break;
И в лог ничего не попадает....(((

Ответить