2010-05-14 5 views
20

Kendi defaultHandler'ımı rss beslemelerini ayrıştırmak için oluşturdum ve çoğu yayın için iyi çalışıyor, ancak ESPN için, yol nedeniyle makale URL'sinin bir bölümünü kesiyor ESPN formatları URL'lerdir. ESPN tam bir makale url bir örneği ..Android SAX ayrıştırıcısı arasındaki tam metin almadım

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

sorun DefaultHandler karakterler yöntem yalnızca yukarıdaki url içeren etiketinden bu oluyor nedense içindir.

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

Eğer, bu ve işareti kaçış kodundan ve sonra url kapalı her şeyi kesiyor görebileceğiniz gibi. SAX ayrıştırıcısını bu çıkış kodunda dizgimi kesmemeyi nasıl sağlayabilirim? Ref için Burada benim karakterler yöntem .. Gördüğünüz gibi, bu ve işareti kaçış kodundan ve sonra url kapalı herşeyi kesiyor

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.

cevap

45

olduğunu. characters() yöntemin documentation itibaren

:

Ayrıştırıcı raporunun karakter her veri yığın için bu yöntemi arayacak. SAX ayrıştırıcıları tek bir yığın tüm bitişik karakter verilerini döndürebilir veya da birçok parçalar halinde bölünmüş olabilir; Locator yararlı bilgiler sağlar, böylece ancak, herhangi tek olay karakterlerin hepsi aynı dış varlık gelmelidir.

public void characters (char ch[], int start, int length) { 
    if (buf!=null) { 
     for (int i=start; i<start+length; i++) { 
      buf.append(ch[i]); 
     } 
    } 
} 

Sonra endElement() yılında, ben StringBuilder içeriğini almak ve onunla bir şeyler yapmak:

Ben SAX ayrıştırıcıları yazmak

, ben characters() geçirilen her şeyi eklemek için bir StringBuilder kullanın. ayrıştırıcı characters() birkaç kez çağırırsa Bu şekilde, hiç bir şey kaçırmayın.

+0

Tamam, gerçekten ayrıştırıcı çalışıyordu nasıl tam olarak anlamak için zaman almadı. Cevabınızı okuduktan sonra daha iyi bir anlayış elde etmek için geri döndüm ve daha fazla araştırdım. Öneriniz elbette sorun oldu, o zamandan beri düzgün karakter verilerini işlemek için kodumu güncelledik. TY – brockoli

+0

@CommonsWare: bazı karakterleri özlüyorsun? Benim durumumda karşı karşıyayım. – Ankit

+0

image1: başlığım xml'de ve bazen tam değer alıyorum ve bazen sadece "itle" veya "Title" var. Değerleri yazdırmaya çalıştım ama hiçbir zaman kısmi değerler için "image1:" yazdı. – 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; 
    } 
} 

Ben de anladım, yukarıdaki kod çözümdür.

+0

Yukarıdaki cevaptan birkaç işaretçiyi aldım. – anonymous123