2015-03-14 2 views
0

Я создаю небольшое приложение для чтения в новостной ленте BBC f1 в Android и для отображения в ListView. Я создал следующие функции синтаксического анализа, следуя этому Android Developer Tutorial.Парсер Android XML только извлекает первый элемент из фида

Когда items ArrayList возвращается к деятельности, он имеет только один элемент, самую последнюю новость. Когда я регистрирую

Эти функции вызывается после успешного извлечения данных через асинхронный вызов. На второй до последней строке выходной заголовок совпадает с возвращенным элементом массива.

Я отправил вывод LogCat на Pastebin here

RSS Структура

<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"> 
    <channel> 
     // unrequired tags (title, description, lang etc) 
     <item> 
      <title></title> 
      <description></description> 
      <link></link> 
      <guid isPermaLink="false"></guid> 
      <pubDate></pubDate> 
      <media:thumbnail /> 
      <media:thumbnail /> 
     </item> 
     <item> 
      <title></title> 
      <description></description> 
      <link></link> 
      <guid isPermaLink="false"></guid> 
      <pubDate></pubDate> 
      <media:thumbnail /> 
      <media:thumbnail /> 
     </item> 
    </channel> 
</rss> 

функция подачи чтения

private static ArrayList<BBCItem> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
    //Log.d("read feed", ""); 
    ArrayList<BBCItem> items = new ArrayList(); 

    parser.require(XmlPullParser.START_TAG, ns, "rss"); 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     // Starts by looking for the channel tag 
     if (name.equals("channel")) { 
      // navigate to the item tag here 
      parser.require(XmlPullParser.START_TAG, ns, "channel"); 
      while (parser.next() != XmlPullParser.END_TAG){ 
       if (parser.getEventType() != XmlPullParser.START_TAG) { 
        continue; 
       } 
       name = parser.getName(); 
       if (name.equals("item")){ 
        items.add(bbcReadEntry(parser)); 
       } 
       else { 
        skip(parser); 
       } 
      } 
     } else { 
      skip(parser); 
     } 
    } 
    return items; 
} 

предмет чтения индивидуальной подачи

public static BBCItem bbcReadEntry(XmlPullParser parser) throws XmlPullParserException, IOException { 
    parser.require(XmlPullParser.START_TAG, ns, "item"); 
    String title = null; 
    String description = null; 
    String url = null; 
    String pubDate = null; 
    String thumbnailURL = null; 
    while (parser.next() != XmlPullParser.END_TAG) { 
     if (parser.getEventType() != XmlPullParser.START_TAG) { 
      continue; 
     } 
     String name = parser.getName(); 
     if (name.equals("title")) { 
      title = readString(parser, "title"); 
     } else if (name.equals("description")) { 
      description = readString(parser, "description"); 
     } else if (name.equals("link")) { 
      url = readString(parser, "link"); 
     } else if (name.equals("pubDate")) { 
      pubDate = readString(parser, "pubDate"); 
     } else if (name.equals("media:thumbnail")) { 
      //thumbnailURL = readThumbnail(parser); 
      thumbnailURL = "http://news.bbcimg.co.uk/media/images/81615000/jpg/_81615988_nicorosberg.jpg"; 
     } 
     else { 
      skip(parser); 
     } 
    } 
    Log.d("News item title", title); 
    return new BBCItem(title, description, url, pubDate, thumbnailURL); 
} 

Любая помощь очень ценится

Благодаря

ответ

0

Я никогда не удалось получить эту работу полностью. Вместо этого я преобразовал XML-строку в JSON и манипулировал ею (что мне гораздо удобнее).

This answer как я преобразовал его из XML в JSON.

1

Я столкнулся с почти одинаковой проблемой при работе над чем-то здесь. Я пытался разобрать xml в XML-файле rss-файла. То же самое произошло, что я получил только первый «предмет». Я также рассматривал возможность преобразования xml в json и более легко обрабатывать его как json. Но мне, наконец, удалось заставить его работать для меня с xml-файлом без конверсии в json. Что идет не так, здесь ссылки, которые не имеют END_TAG, как в моем случае это вызвало проблему:

<enclosure url="http:/blabla....mp3" length="123456" type="audio/mpeg" /> 

В вашем случае это может привести к такому же вопросу:

<media:thumbnail /> 

Выполнив эту страницу документации Google https://developer.android.com/training/basics/network-ops/xml.html, много тестов и царапин на голове, я решил проблему после получения атрибута «url», вызвав метод «skip (parser)» непосредственно после получения значения атрибута «url». Эта единственная строка исправила проблему с моей стороны. Я предполагаю, что парсер затем выходит из этой TAG и продолжает с остальными. Надеюсь, что это поможет.

0

Хорошо, у меня была аналогичная проблема при попытке проанализировать канал новостей Scientific American technology. В документе разработчиков Android, метод readFeed() выглядит следующим образом:

private List readFeed(XmlPullParser parser) throws XmlPullParserException, IOException { 
List entries = new ArrayList(); 

parser.require(XmlPullParser.START_TAG, ns, "feed"); 
while (parser.next() != XmlPullParser.END_TAG) { 
    if (parser.getEventType() != XmlPullParser.START_TAG) { 
     continue; 
    } 
    String name = parser.getName(); 
    // Starts by looking for the entry tag 
    if (name.equals("entry")) { 
     entries.add(readEntry(parser)); 
    } else { 
     skip(parser); 
    } 
} 
return entries;} 

Причина, почему мой код только отправляет первый элемент в RSS-канале, потому что (после входа записи в строке «записях.добавить (readEntry (анализатор));», он попадает в конец записи RSS элемента и попадает в строку:

while (parser.next() != XmlPullParser.END_TAG) { 

Это фактически прерывает RSS синтаксический, а затем вы попали в„возвращающие записи;“ линия, которая возвращает записи ArrayList с одним элементом в.

чтобы исправить это (по крайней мере, он работал для меня), просто изменить «END_TAG» в «END_DOCUMENT», и это работает прекрасно.

while (parser.next() != XmlPullParser.END_DOCUMENT) { 

I просто надеюсь, что это помогает кому-то, так как я весь день общался с этим :-) Удачи в разборе XML.