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.
- Cómo ignorar errores XML al analizar XML defectuoso con Sax (en Android)
- Pasar recurso XML a XMLReader
- Portar a Android: ¿por qué estoy recibiendo "No se puede crear XMLReader por defecto; Es la propiedad del sistema org.xml.sax.driver set? "?
- Android SAX Parsing: Cómo conservar Newlines desde dentro de una etiqueta CDATA
- El resultado es diferente.
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.
- ¿Qué tamaño de archivo xml debe considerarse demasiado grande para un analizador de DOM?
- Se ha producido un error de análisis XML de Android Error inesperado
- Android: analiza XML desde problemas de cadena
- Cómo conservar los nodos XML que no están enlazados a un objeto cuando se utiliza SAX para analizar
- Cómo analizar XML utilizando el analizador SAX
- Sax - ExpatParser $ ParseException
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.