Подтвердить что ты не робот

Парсер Android SAX не получает полный текст между тегами

Я создал свой собственный DefaultHandler для синтаксического анализа rss-каналов, и для большинства фидов он отлично работает, однако для ESPN он отключает часть URL-адреса статьи из-за того, как ESPN форматирует URL-адреса. Пример полного URL-адреса статьи из ESPN..

http://sports.espn.go.com/nba/news/story?id=5189101&campaign=rss&source=ESPNHeadlines

Проблема по какой-то причине метод DefaultHandler символов получает только это из тега, который содержит указанный выше URL.

http://sports.espn.go.com/nba/news/story?id=5189101

Как вы можете видеть, он отсекает все от URL-адреса из кода возврата и возврата. Как я могу заставить анализатор SAX не вырезать строку в этом escape-коде? Для реф. вот мой метод символов.

 public void characters(char ch[], int start, int length) {

  String chars = (new String(ch).substring(start, start + length));

  try {
   // If not in item, then title/link refers to feed
   if (!inItem) {
    if (inTitle)
     currentFeed.title = chars;
   } else {
    if (inLink)
     currentArticle.url = new URL(chars);
    if (inTitle)
     currentArticle.title = chars;
    if (inDescription)
     currentArticle.description = chars;
    if (inPubDate)
     currentArticle.pubDate = chars;
    if (inEnclosure) {
    }
   }
  } catch (MalformedURLException e) {
   Log.e("RSSReader", e.toString());
  }
 }

Rob W.

4b9b3361

Ответ 1

Как вы можете видеть, это резка все от URL-адреса от амперсанд и код выхода и после.

Из документации метода characters():

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

Когда я пишу SAX-синтаксические анализаторы, я использую StringBuilder для добавления всего, что было передано в characters():

public void characters (char ch[], int start, int length) {
    if (buf!=null) {
        for (int i=start; i<start+length; i++) {
            buf.append(ch[i]);
        }
    }
}

Затем в endElement() я беру содержимое StringBuilder и делаю что-то с ним. Таким образом, если парсер вызывает characters() несколько раз, я ничего не пропускаю.

Ответ 2

@Override
public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException {
    // TODO Auto-generated method stub
    sb=new StringBuilder();
    if(localName.equals("icon"))
    {
        iconflag=true;
    }
}

@Override
public void characters (char ch[], int start, int length) {
    if (sb!=null && iconflag == true) {
        for (int i=start; i<start+length; i++) {
            sb.append(ch[i]);
        }
    }
}

@Override
public void endElement(String uri, String localName, String qName)
        throws SAXException {
    // TODO Auto-generated method stub
    if(iconflag)
    {
        info.setIcon(sb.toString().trim());
        iconflag=false;
    }
}

Итак, я понял, код выше - это решение.