2013-06-21 2 views
0

Я пытаюсь сделать читатель RSS, который использует XML из Интернета. По какой-то причине он только считывает последний элемент.My Parser Skips Elements

Это довольно много XML-файл:

<rss version="2.0"> 
    <channel> 
     <item> 
      <mainTitle>...</mainTitle> 
      <headline> 
       <title>...</title> 
       <description>...</description> 
       <subTitle>...</subTitle> 
       <link>...</link> 
      </headline> 

      <headline> 
       <title>...</title> 
       <description>...</description> 
       <subTitle>...</subTitle> 
       <link>...</link> 
      </headline> 
     </item> 

     <item> 
      <mainTitle>...</mainTitle> 
      <headline> 
       <title>...</title> 
       <description>...</description> 
       <subTitle>...</subTitle> 
       <link>...</link> 
      </headline> 

      <headline> 
       <title>...</title> 
       <description>...</description> 
       <subTitle>...</subTitle> 
       <link>...</link> 
      </headline> 
     </item> 
    </channel> 
</rss> 

Это парсер:

public class RssHandler extends DefaultHandler { 

    // Feed and Article objects to use for temporary storage 
    private Article currentArticle = new Article(); 
    private List<Article> articleList = new ArrayList<Article>(); 

    // Number of articles added so far 
    private int articlesAdded = 0; 

    // Number of articles to download 
    private static final int ARTICLES_LIMIT = 20; 

    // Current characters being accumulated 
    StringBuffer chars = new StringBuffer(); 

    // Current characters being accumulated 
    int cap = new StringBuffer().capacity(); 

    // Basic Booleans 
    private boolean wantedItem = false; 
    private boolean wantedHeadline = false; 
    private boolean wantedTitle = false; 

    public List<Article> getArticleList() { 
     return articleList; 
    } 

    public Article getParsedData() { 
     return this.currentArticle; 
    } 

    public RssHandler() { 
     this.currentArticle = new Article(); 
    } 

    public void startElement(String uri, String localName, String qName, 
      Attributes atts) { 
     chars = new StringBuffer(); 

    } 

    public void endElement(String uri, String localName, String qName) 
      throws SAXException { 

     if (localName.equalsIgnoreCase("title")) { 
      currentArticle.setTitle(chars.toString()); 
     } else if (localName.equalsIgnoreCase("subtitle")) { 
      currentArticle.setDescription(chars.toString()); 
     } else if (localName.equalsIgnoreCase("pubdate")) { 
      currentArticle.setPubDate(chars.toString()); 
     } else if (localName.equalsIgnoreCase("guid")) { 
      currentArticle.setGuid(chars.toString()); 
     } else if (localName.equalsIgnoreCase("author")) { 
      currentArticle.setAuthor(chars.toString()); 
     } else if (localName.equalsIgnoreCase("link")) { 
      currentArticle.setEncodedContent(chars.toString()); 
     } else if (localName.equalsIgnoreCase("item")) 

     // Check if looking for article, and if article is complete 
     if (localName.equalsIgnoreCase("item")) { 

      articleList.add(currentArticle); 

      currentArticle = new Article(); 

      // Lets check if we've hit our limit on number of articles 
      articlesAdded++; 
      if (articlesAdded >= ARTICLES_LIMIT) { 
       throw new SAXException(); 
      } 
     } 
     chars.setLength(0); 
    } 
    public void characters(char ch[], int start, int length) { 
     chars.append(ch, start, length); 

    } 
} 

Всякий раз, когда я отладки QName приложение никогда не является прямым потомком пункта.

Он читает RSS -> канал -> пункт -> название -> описание ...

Я невежественный. Пожалуйста помоги!

ответ

0

1) В конце EndElement() метод, вы не сбросить длину символов ИЭ

public void endElement(String uri, String localName, String qName) 
     throws SAXException { 

    //...   
    //Reset 'chars' length at the end always. 
    chars.setLength(0); 
    } 

2) Изменение ваших персонажей (...) метод, как показано ниже:

public void characters(char ch[], int start, int length) { 
     chars.append(ch, start, length); 
    } 

[EDIT

3) Переместите инициализацию «символов» из «startElement» в конструктор. то есть:

public RssHandler() { 
    this.currentArticle = new Article(); 
    //Add here.. 
    chars = new StringBuffer(); 
} 

и

public void startElement(String uri, String localName, String qName, 
     Attributes atts) { 
    //Remove below line.. 
    //chars = new StringBuffer(); 
} 

4) Наконец, используйте QName, чтобы проверить соответствие меток вместо LocalName т.е.

if (qName.equalsIgnoreCase("title")) { 
     currentArticle.setTitle(chars.toString().trim()); 
    } else if (qName.equalsIgnoreCase("subtitle")) { 
     currentArticle.setDescription(chars.toString().trim()); 
    } //... 

EDIT]

Подробнее @Using SAXParser in Android

+0

Thank y ОУ! Я изменил это, но основная проблема по-прежнему сохраняется, поскольку он не распознает тег , он только публикует последнюю статью из каждого . Он переписывает каждый заголовок/субтитр/pubdate и т. Д. С последним (в данном случае последний заголовок). – AlexiPwns

+0

Пожалуйста, просмотрите отредактированный ответ, в котором исправлены исправленные ошибки – Chandan