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

bro*_*oli 21 parsing android sax escaping

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

http://sports.espn.go.com/nba/news/story?id=5189101&campaign=rss&source=ESPNHeadlines
Run Code Online (Sandbox Code Playgroud)

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

http://sports.espn.go.com/nba/news/story?id=5189101
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它正在从&符号转义码和之后的网址中删除所有内容.如何让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());
  }
 }
Run Code Online (Sandbox Code Playgroud)

罗布

Com*_*are 46

正如你所看到的,它正在从&符号转义码和之后的网址中删除所有内容.

文档中的characters()方法:

解析器将调用此方法来报告每个字符数据块.SAX解析器可以在一个块中返回所有连续的字符数据,或者它们可以将它分成几个块; 但是,任何单个事件中的所有字符都必须来自同一个外部实体,以便Locator提供有用的信息.

当我编写SAX解析器时,我使用a 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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后endElement(),我把它的内容StringBuilder和它做了一些事情.这样,如果解析器characters()多次调用,我不会错过任何东西.


ano*_*123 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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