2010-05-14 9 views
20

He creado mi propio DefaultHandler para analizar feeds rss y para la mayoría de los feeds funciona bien, sin embargo, para ESPN, está cortando parte de la url del artículo debido a la forma Los formatos de ESPN son urls. Un ejemplo de un artículo de URL completa de ESPN ..Analizador SAX de Android que no recibe el texto completo entre las etiquetas

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 caracteres DefaultHandler sólo es cada vez esto desde la etiqueta que contiene la URL anterior.

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

Como puede ver, está cortando todo lo que está fuera de la url del código de escape de ampersand y después. ¿Cómo puedo hacer que el analizador SAX no corte mi cuerda en este código de escape? Por ref. aquí es mi método caracteres ..

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.

Respuesta

45

Como se puede ver, se está cortando todo lo que fuera la url del código de escape símbolo de unión y después.

Desde el documentation del método characters():

El Analizador llamará a este método para informe de cada trozo de datos de caracteres. Los analizadores SAX pueden devolver todos los datos contiguos de caracteres en un solo fragmento, o pueden dividirlo 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, uso un StringBuilder para añadir todo lo que pasó 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]); 
     } 
    } 
} 

Luego, en endElement(), tomo el contenido de la StringBuilder y hacer algo con él. De esta forma, si el analizador llama al characters() varias veces, no me pierdo nada.

+0

Ok, realmente no me tomé el tiempo para entender completamente cómo estaba funcionando el analizador. Después de leer su respuesta, volví e investigué más para obtener una mejor comprensión. Su sugerencia fue el problema, por supuesto, desde entonces he actualizado mi código para manejar los datos de los caracteres correctamente. TY – brockoli

+0

@CommonsWare: ¿Extraño algunos personajes? Lo estoy enfrentando en mi caso. – Ankit

+0

Tengo imagen1: título en mi xml y en algún momento obtengo un valor total y, a veces, obtengo solo "itle" o "Título". He intentado imprimir valores, pero nunca ha impreso "imagen1:" para valores parciales. – Ankit

5
@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.

+0

He tomado algunos consejos de la respuesta anterior. – anonymous123

Cuestiones relacionadas