Android SAX解析器无法从标记之间获取完整文本

时间:2010-05-14 22:44:44

标签: android parsing escaping sax

我已经创建了自己的DefaultHandler来解析rss提要,对于大多数提要它工作正常,但是,对于ESPN,由于ESPN格式化网址的方式,它正在切断部分文章网址。来自ESPN的完整文章网址的一个例子..

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

问题是出于某种原因,DefaultHandler字符方法只从包含上述URL的标记中获取。

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

Rob W。

3 个答案:

答案 0 :(得分:46)

  

正如你所看到的,它正在削减   一切都离开了网址   &符号转义码和之后。

来自characters()方法的documentation

  

Parser会调用此方法   报告每个字符数据块。   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(),我就不会错过任何内容。

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

前几天我遇到了这个问题,事实证明原因是如果值中包含以下任何字符,则多次调用CHaracters方法:

True

还要注意值内的换行符/换行符!!! 如果xml在没有您的控制的情况下被换行,则还会为该语句中的每一行调用character方法,此外它将返回换行符! (您需要手动依次删除)。

一个处理所有这些问题的示例处理程序是这样的:

"   &quot;
'   &apos;
<   &lt;
>   &gt;
&   &amp;

我希望这会有所帮助。