2010-05-14 54 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