Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
fear665
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 22
#1

RSS парсер, чтение и последующая запись в объект не осуществляются - Android

25.09.2014, 16:29. Просмотров 798. Ответов 8
Метки нет (Все метки)

При написании парсера произошел ступор
Подскажите, что пошло не туда

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
private ArrayList<Entry> readFeed(InputStream is) throws XmlPullParserException, IOException {
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            Log.d("debug", "starting working with DB");
            xpp.setInput(is, null);//TODO: check this method, should I read IS by myself. It may be not nesessary
            Log.d("debug", "input was successful");
            ArrayList<Entry> arrayList = new ArrayList<Entry>();
            Entry serviceEntry = null;
            int counterOfLink = 1;
            int counterOfTitle = 1;
 
            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
                Log.d("debug", "reading document");
                //прямиком на говнокод
                int result = xpp.getEventType();
                if(result == XmlPullParser.START_TAG){
                    if(xpp.getName().equals("item")){
                        serviceEntry = new Entry();
                        //till it ends </item>
                        if(xpp.getName().equals("title")){
                            //may be one problem with teg title in xml, that isn't in tag item
                            if(counterOfTitle <= 1){
                                StaticUtil.setMainTitle(readText(xpp));
                                counterOfTitle = ++counterOfTitle;
                            }else {
                                Log.d("debug", "check adding "+ readText(xpp)); //TODO: CHECK ADDING INFORMATION
                                serviceEntry.setTitle(readText(xpp));
                                Log.d("debug", "check adding "+ readText(xpp)); //TODO: CHECK ADDING INFORMATION
                            }
                        }
                        if(xpp.getName().equals("description")){
                            Log.d("debug", "check adding "+ readText(xpp)); //TODO: CHECK ADDING INFORMATION
                            serviceEntry.setTitle(readText(xpp));
                        }
                        if(xpp.getName().equals("pubDate")){
                            serviceEntry.setDate(readText(xpp));
                        }
                        if(xpp.getName().equals("link")){
                            if(counterOfLink <= 1){
                                StaticUtil.setLink(readText(xpp));
                                counterOfTitle = ++counterOfLink;
                            }
                            serviceEntry.setLink(readText(xpp));
                        }
                    }
                }else if (result == XmlPullParser.END_TAG){
                    if(xpp.getName().equals("item")){
                        arrayList.add(serviceEntry);
                        serviceEntry = null;
                    }
                }//TODO:Add method for another information, except for items
                xpp.next();
            }
            return arrayList;
        }
 
        private String readText(XmlPullParser parser) throws IOException, XmlPullParserException {
            String result = "";
            if (parser.next() == XmlPullParser.TEXT) {
                result = parser.getText();
                Log.d("debug", "trying to read");
                parser.nextTag(); //TODO: Check if there is a endless cycle
            }
            return result;
        }
 
        private InputStream downloadUrl(String urlString) throws IOException {
            URL url = new URL(urlString);
            Log.d("debug", "starting connection");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            Log.d("debug", "opening of connection");
            conn.setReadTimeout(10000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();
            Log.d("debug", "connection successful");
            return conn.getInputStream();
        }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2014, 16:29     RSS парсер, чтение и последующая запись в объект не осуществляются
Посмотрите здесь:

Android Создание RSS реадера
Android RSS клиент
Как передать параметр в RSS парсер Android
Android UI rss читалки
Чтение и запись JSON файла Android
Android Listener и RSS
Подскажите лучший способ хранения данных, чтение/запись файлов Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
chizz
979 / 493 / 54
Регистрация: 19.03.2013
Сообщений: 3,074
Записей в блоге: 18
Завершенные тесты: 1
25.09.2014, 16:57     RSS парсер, чтение и последующая запись в объект не осуществляются #2
fear665, а как ты предлагаешь нам это проверить?
Что говорят логи? В каком месте затык?
fear665
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 22
25.09.2014, 17:04  [ТС]     RSS парсер, чтение и последующая запись в объект не осуществляются #3
На 14 строке логер срабатывает. Далее, чтение и последующая запись в объект не осуществляется
Думаю, что я что-то не так делаю с next() и nextTag()
chizz
979 / 493 / 54
Регистрация: 19.03.2013
Сообщений: 3,074
Записей в блоге: 18
Завершенные тесты: 1
25.09.2014, 17:11     RSS парсер, чтение и последующая запись в объект не осуществляются #4
fear665, Вот пример использования XmlPullParser, там case switch. Попробуйте заменить if на case switch
Также проверьте не null ли xpp после xpp.setInput(is, null);

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 try {
      XmlPullParser xpp = prepareXpp();
 
      while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
        switch (xpp.getEventType()) {
        // начало документа
        case XmlPullParser.START_DOCUMENT:
          Log.d(LOG_TAG, "START_DOCUMENT");
          break;
        // начало тэга
        case XmlPullParser.START_TAG:
          Log.d(LOG_TAG, "START_TAG: name = " + xpp.getName()
              + ", depth = " + xpp.getDepth() + ", attrCount = "
              + xpp.getAttributeCount());
          tmp = "";
          for (int i = 0; i < xpp.getAttributeCount(); i++) {
            tmp = tmp + xpp.getAttributeName(i) + " = "
                + xpp.getAttributeValue(i) + ", ";
          }
          if (!TextUtils.isEmpty(tmp))
            Log.d(LOG_TAG, "Attributes: " + tmp);
          break;
        // конец тэга
        case XmlPullParser.END_TAG:
          Log.d(LOG_TAG, "END_TAG: name = " + xpp.getName());
          break;
        // содержимое тэга
        case XmlPullParser.TEXT:
          Log.d(LOG_TAG, "text = " + xpp.getText());
          break;
 
        default:
          break;
        }
        // следующий элемент
        xpp.next();
      }
      Log.d(LOG_TAG, "END_DOCUMENT");
 
    } catch (XmlPullParserException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
 
  XmlPullParser prepareXpp() {
    return getResources().getXml(R.xml.data);
  }
}
fear665
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 22
25.09.2014, 17:16  [ТС]     RSS парсер, чтение и последующая запись в объект не осуществляются #5
Спасибо. Я рассматривал этот вариант
Попробую переделать
Все же хотел бы узнать, что не так делал в моём варианте
chizz
979 / 493 / 54
Регистрация: 19.03.2013
Сообщений: 3,074
Записей в блоге: 18
Завершенные тесты: 1
25.09.2014, 17:24     RSS парсер, чтение и последующая запись в объект не осуществляются #6
Цитата Сообщение от fear665 Посмотреть сообщение
Все же хотел бы узнать, что не так делал в моём варианте
Для этого нужно создавать проект, копировать ваш код, смотреть, что там не работает. Это долго
fear665
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 22
25.09.2014, 17:35  [ТС]     RSS парсер, чтение и последующая запись в объект не осуществляются #7
Решение тоже рабочее, но в моём случае необходимо доставать значения определённых вложенных элементов и затем записывать в список. А где меня подвели проверки, я не вижу. Поэтому и прошу помощи
Ссылка на rss для примера: http://www.npr.org/rss/rss.php?id=1006
Ссылка на репозиторий: https://github.com/olegnikitin/RssTestTask.git
ADS с Gradle на базе)
chizz
979 / 493 / 54
Регистрация: 19.03.2013
Сообщений: 3,074
Записей в блоге: 18
Завершенные тесты: 1
28.09.2014, 18:30     RSS парсер, чтение и последующая запись в объект не осуществляются #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот мой парсер рабочий, может поможет. Твой проект я с полпинка не смог завести
Там много лишнего, но суть есть

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent(),charset));
                                XmlPullParser xpp = prepareXpp(rd);
                                boolean itemStart = false;
                                int i = 0;
                                int countNew = 0;
                                while ((xpp.getEventType() != XmlPullParser.END_DOCUMENT) && (i<Integer.parseInt(numl))) {
                                      switch (xpp.getEventType()) {
                                      case XmlPullParser.START_DOCUMENT:
                                         // Log.d(LOG_TAG, "START_DOCUMENT");
                                          break;
                                        // начало тэга
                                        case XmlPullParser.START_TAG:
                                            //currentTag = xpp.getName();
                                            if (xpp.getName().equals("item")) itemStart = true;
                                            
                                            if (xpp.getName().equals("link")&&itemStart)
                                            {
                                                postLink = readText(xpp);
                                                //Log.w(LOG_TAG,postLink);
                                                Pattern pattern = Pattern.compile("post(\\d+)");
                                                Matcher matcher = pattern.matcher(postLink);
                                                if (matcher.find())
                                                {
                                                    postLink=matcher.group(1);
                                                    //Log.w(LOG_TAG,postLink);
                                                }
                                            }
                                            
                                            if (xpp.getName().equals("url"))
                                            {
                                                jidStr = readText(xpp);
                                                // разобрать jidStr, вернуть jid
                                                //Log.w(LOG_TAG,jidStr);
                                                Pattern pattern = Pattern.compile("(\\d+)_(\\d+)");
                                                Matcher matcher = pattern.matcher(jidStr);
                                                if (matcher.find())
                                                {
                                                    jidStr=matcher.group(1);
                                                }
                                                
                                            }
                                        
                                          break;
                                        // конец тэга
                                        case XmlPullParser.END_TAG:
                                            if (xpp.getName().equals("item"))
                                            {
                                                pdaUrl = "http://www.li.ru/interface/pda/?act=comments&jid="+jidStr+"&pid="+postLink;
                                        
                                                // вот тут надо увеличить count и передать его в PostExecute
                                                String UrlFromDB = loginDataBaseAdapterMT.getSinlgeEntryURLF(pdaUrl);
                                  
                                                if (UrlFromDB.equals("NOT EXIST"))
                                                countNew++;
                                                
                                                i++; // numload count
                                              }
                                       //   Log.d(LOG_TAG, "END_TAG: name = " + xpp.getName());
                                          break;
                                        // содержимое тэга
                                        case XmlPullParser.TEXT:
                                        
                                      //    Log.d(LOG_TAG, "text = " + xpp.getText());
                                          break;
 
                                        default:
                                      //    break;
                                      }
                                      // следующий элемент
                                        xpp.next();
                                }
                                
                                
                                 loginDataBaseAdapterMT.updateEntryRSS(mUrl, Integer.toString(countNew)); 
                             }  
                            loginDataBaseAdapterMT.close();
                    
                            cursor_all.close(); 
                            return bbusername;
                        
                        // return list; 
                    
                    } catch (ClientProtocolException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (XmlPullParserException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    loginDataBaseAdapterMT.close();
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2014, 14:29     RSS парсер, чтение и последующая запись в объект не осуществляются
Еще ссылки по теме:

Android Изображение в RSS ленте
Android Запись и чтение класса в файл
Android Чтение и запись xml файла на SD-карту
Чтение и запись внешних файлов Android
Чтение и запись данных в локальную БД SQLite Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
fear665
0 / 0 / 0
Регистрация: 24.05.2011
Сообщений: 22
29.09.2014, 14:29  [ТС]     RSS парсер, чтение и последующая запись в объект не осуществляются #9
Спасибо
На такой ответ и не надеялся)
Yandex
Объявления
29.09.2014, 14:29     RSS парсер, чтение и последующая запись в объект не осуществляются
Ответ Создать тему
Опции темы

Текущее время: 11:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru