Парсер 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.
Ответы
Ответ 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;
}
}
Итак, я понял, код выше - это решение.