Analizador de SAX de Android que no obtiene texto completo entre etiquetas

He creado mi propio DefaultHandler para analizar rss feeds 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 formatos es urls. Un ejemplo de un artículo completo url de ESPN ..

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

El problema es por alguna razón el método de los caracteres de DefaultHandler está consiguiendo solamente esto de la etiqueta que contiene la url anterior.

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

Como puede ver, está cortando todo de la url del código de escape de ampersand y después. ¿Cómo puedo obtener el analizador sintáctico SAX para no cortar mi cadena en este código de escape? Para ref. Aquí está mi método de 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á cortando todo de la url del código de escape de ampersand y después.

A partir de la documentación del método 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 dividirlos en varios fragmentos; Sin embargo, todos los caracteres en cualquier evento individual deben provenir de la misma entidad externa para que el localizador proporcione información útil.

Cuando escribo analizadores SAX, utilizo StringBuilder para añadir todo lo que pasa a 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]); } } } 

Entonces en endElement() , tomo el contenido del StringBuilder y hago algo con él. De esa manera, si el analizador llama a los 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 me di cuenta, el código de arriba es la solución.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.