2013-04-28 4 views
0

Я разрабатываю устройство чтения RSS-каналов для Android, а для разбора XML-файлов я использую API SAX. Проблема в том, что при анализе данных часть текста усекается случайным образом в некоторых случайно выбранных тегах (я имею в виду разные экземпляры одного и того же тега). Мне более понятно, я добавил скриншот.SAXParser дает неожиданные случайные результаты

enter image description here

Вот мой Handler класс:

public class RssParseHandler extends DefaultHandler { 

    private List<RssItem> rssItems; 
    private RssItem currentItem; 
    private boolean parsingTitle; 
    private boolean parsingLink; 
    //StringBuilder temp; 

    public RssParseHandler() { 
     rssItems = new ArrayList<RssItem>();   
     //temp = new StringBuilder(); 
    } 

    public List<RssItem> getItems() { 
     return rssItems; 
    } 

    @Override 
     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 
     if ("item".equals(qName)) { 
      currentItem = new RssItem(); 
     } else if ("title".equals(qName)) { 
      parsingTitle = true; 
     } else if ("link".equals(qName)) { 
      parsingLink = true; 
     } 
    }  

    @Override 
    public void endElement(String uri, String localName, String qName) throws SAXException { 
     if ("item".equals(qName)) { 
      rssItems.add(currentItem); 
      currentItem = null; 
     } else if ("title".equals(qName)) { 
      //currentItem.setTitle(new String(temp)); 
      //temp = new StringBuilder(); 
      parsingTitle = false; 
     } else if ("link".equals(qName)) { 
      //currentItem.setLink(new String(temp)); 
      //temp = new StringBuilder(); 
      parsingLink = false; 
     } 
    } 

    @Override 
    public void characters(char[] ch, int start, int length) throws SAXException { 
     if (parsingTitle) { 
      if (currentItem != null) 
      { 
      //temp.append(ch, start, length); 
      currentItem.setTitle(new String(ch, start, length)); 
      } 
     } else if (parsingLink) { 
      if (currentItem != null) { 
       //temp.append(ch, start, length); 
       currentElement.setLink(new String(ch, start, length)); 
       parsingLink = false; 
      } 
     } 
    } 
} 

Методы setTitle(String str) и setLink(String str) являются сеттер методы класса RSSItem.

Я искал эту проблему и читал где-то использовать StringBuilder. Поэтому я попытался использовать StringBuilder. (Я прокомментировал код, когда использовал StringBuilder). Но потом я начал получать NullPointerException.

Любые предложения по избавлению от этой проблемы?

ответ

1

Из док

синтаксический анализатор будет вызывать этот метод, чтобы сообщить каждый кусок характера данных. Анализаторы SAX могут возвращать все непрерывные символьные данные в одном блоке , или они могут разбить его на несколько кусков; однако все символы в любом отдельном событии должны поступать от одного и того же внешнего объекта , чтобы локатор предоставил полезную информацию.

Таким образом, вы получаете частичный кусок данных. Возможное решение может быть:

if (currentItem != null) { 
     //temp.append(ch, start, length); 
     String tmpLink = currentElement.getLink(); 
     tmpLink += new String(ch, start, length); 
     currentElement.setLink(tmpLink); 

    } 

конечно currentElement.getLink() должен возвращать пустой String и не null ссылочных.

+0

Спасибо. Это сработало отлично :) – Rajat

0

Ваша проблема в том, что вы предполагаете, что метод characters будет обрабатывать все символы внутри элемента, что неверно.

Вы должны сохранять и конкатенировать новые символы с предыдущими символами, если они есть.

Использование StringBuilder подходит для вашего дела. Вам просто нужно обращаться с NPE, который у вас есть.