2010-05-14 11 views
20

Ho creato il mio DefaultHandler per analizzare i feed rss e per la maggior parte dei feed sta funzionando bene, tuttavia, per ESPN, sta tagliando parte dell'url di articolo a causa del modo ESPN formatta i suoi URL. Un esempio di un articolo di URL completo da ESPN ..parser SAX Android che non ottiene il testo completo tra i tag

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

Il problema è per qualche motivo il metodo di caratteri DefaultHandler sta ottenendo solo questo dal tag che contiene l'URL sopra.

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

Come potete vedere, sta tagliando tutto dall'URL dal codice di escape e commerciale e dopo. Come posso ottenere il parser SAX per non tagliare la mia stringa in questo codice di escape? Per rif. qui è il mio metodo caratteri ..

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.

risposta

45

Come si può vedere, è il taglio tutto fuori l'URL dal codice di escape commerciale e dopo.

Dal documentation del metodo characters():

il parser chiamerà questo metodo per rapporto ciascun blocco di dati di carattere. I parser SAX possono restituire tutti i dati di carattere contigui in un singolo blocco, oppure possono suddividerlo in più blocchi; tuttavia, tutti i caratteri di un singolo evento devono provenire dalla stessa entità esterna in modo che il Locator fornisca informazioni utili.

Quando scrivo parser SAX, io uso un StringBuilder da aggiungere tutto passato 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]); 
     } 
    } 
} 

Poi nel endElement(), prendo il contenuto del StringBuilder e fare qualcosa con esso. In questo modo, se il parser chiama più volte characters(), non mi manca nulla.

+0

Ok, non mi sono davvero preso il tempo per capire appieno come funzionava il parser. Dopo aver letto la tua risposta sono tornato indietro e ho studiato ulteriormente per ottenere una migliore comprensione. Il tuo suggerimento è stato sicuramente il problema, da allora ho aggiornato il mio codice per gestire correttamente i dati dei caratteri. TY – brockoli

+0

@CommonsWare: mancano alcuni personaggi? Lo sto affrontando nel mio caso. – Ankit

+0

Ho image1: titolo nel mio xml e a volte ottengo il valore completo e talvolta ho solo "itle" o "Title". Ho provato a stampare valori ma non ha mai stampato "immagine1:" per valori parziali. – 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; 
    } 
} 

Così ho capito, il codice sopra è la soluzione.

+0

Ho preso alcuni suggerimenti dalla risposta di cui sopra. – anonymous123

Problemi correlati