tarjeta - El analizador SAX de Android no recibe el texto completo de las etiquetas entre
usar celular como tarjeta nfc (2)
Creé mi propio DefaultHandler para analizar feeds rss y para la mayoría de los feeds está funcionando bien, sin embargo, para ESPN, está cortando parte de la url del artículo debido a la forma en que ESPN forma sus urls. Un ejemplo de una URL completa del artículo de ESPN ..
http://sports.espn.go.com/nba/news/story?id=5189101&campaign=rss&source=ESPNHeadlines
El problema es que, por alguna razón, el método de los caracteres DefaultHandler solo está obteniendo esto de la etiqueta que contiene la url anterior.
http://sports.espn.go.com/nba/news/story?id=5189101
Como puede ver, está recortando todo de la url del código de escape y después. ¿Cómo puedo hacer que el analizador SAX no corte mi cuerda en este código de escape? Por ref. aquí está el método de mis personajes ...
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.
Como puede ver, está recortando todo de la url del código de escape y después.
De la documentation del método de characters()
:
El analizador llamará a este método para informar cada fragmento de datos de caracteres. Los analizadores SAX pueden devolver todos los datos de caracteres contiguos en un solo fragmento, o pueden dividirlo en varios fragmentos; sin embargo, todos los personajes en un solo evento deben provenir de la misma entidad externa para que el Localizador brinde información útil.
Cuando escribo analizadores SAX, uso un StringBuilder
para anexar todo lo que pasa a los 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]);
}
}
}
Luego, en endElement()
, tomo el contenido de StringBuilder
y hago algo con él. De esa forma, si el analizador llama a characters()
varias veces, no echo de menos nada.
@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;
}
}
Así que lo descubrí, el código de arriba es la solución.