2010-05-14 33 views
20

我已經創建了自己的DefaultHandler來解析rss提要,對於大多數提要它工作正常,但是,對於ESPN,它正在切斷部分文章url ESPN格式是它的網址。來自ESPN的一整篇文章的URL的例子..Android SAX解析器沒有從標籤中獲取全文

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

的問題是由於某種原因的DefaultHandler字符方法只從包含上述網址標籤得到這個。

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

正如您所看到的,它會從&符號轉義代碼之後切斷所有網址。我怎樣才能讓SAX解析器在此轉義代碼中不切斷我的字符串?對於參考。這裏是我的人物方法..

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()); 
    } 
} 

羅布·W·

回答

45

正如你可以看到,它的切割 事事休的URL從 符號轉義碼之後。

characters()方法的documentation

解析器會調用這個方法來 報告字符數據的每個存儲塊。 SAX解析器可能會將所有連續的 字符數據返回到一個塊中,或者它們可能會將其分成幾個塊;然而,任何 單個事件中的所有字符必須來自相同的外部實體,以便定位器 提供有用的信息。

當我寫的SAX解析器,我用一個StringBuilder追加一切傳遞給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]); 
     } 
    } 
} 

然後在endElement(),我拿StringBuilder的內容,並用它做什麼。這樣,如果解析器幾次調用characters(),我不會錯過任何東西。

+0

好的,我沒有真正花時間來完全理解解析器是如何工作的。在閱讀你的答案後,我回去進一步研究以獲得更好的理解。你的建議當然是問題,我已經更新了我的代碼以正確處理char數據。 TY – brockoli 2010-05-17 18:19:59

+0

@CommonsWare:做錯了一些字符?我面對我的情況。 – Ankit 2013-07-19 11:28:55

+0

我有 image1:標題 在我的XML和有時我得到充分的價值,有時我只得到「itle」或「標題」。我試圖打印值,但從未打印過「image1:」的部分值。 – Ankit 2013-07-19 11:34:24

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; 
    } 
} 

所以我想通了,上面的代碼是解決方案。

+0

我已經從上面的答案中拿了幾個指針。 – anonymous123 2012-05-29 12:36:31