0

我正在为 Android 开发一个 RSS 提要阅读器,为了解析 XML 文件,我正在使用 SAX API。问题是在解析数据时,一些文本在一些随机选择的标签中以随机方式被截断(我的意思是同一标签的不同实例)。对我来说更清楚的是,我添加了一个屏幕截图。

在此处输入图像描述

这是我的处理程序类:

public class RssParseHandler extends DefaultHandler {

    private List<RssItem> rssItems;
    private RssItem currentItem;
    private boolean parsingTitle;
    private boolean parsingLink;
    //StringBuilder temp;

    public RssParseHandler() {
        rssItems = new ArrayList<RssItem>();        
        //temp = new StringBuilder();
    }

    public List<RssItem> getItems() {
        return rssItems;
    }

    @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("item".equals(qName)) {
            currentItem = new RssItem();
        } else if ("title".equals(qName)) {
            parsingTitle = true;
        } else if ("link".equals(qName)) {
            parsingLink = true;
        }
    }    

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("item".equals(qName)) {
            rssItems.add(currentItem);
            currentItem = null;
        } else if ("title".equals(qName)) {
            //currentItem.setTitle(new String(temp));
            //temp = new StringBuilder();
            parsingTitle = false;
        } else if ("link".equals(qName)) {
            //currentItem.setLink(new String(temp));
            //temp = new StringBuilder();
            parsingLink = false;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (parsingTitle) {
            if (currentItem != null)
            {
            //temp.append(ch, start, length);
             currentItem.setTitle(new String(ch, start, length));
            }
        } else if (parsingLink) {
            if (currentItem != null) {
                //temp.append(ch, start, length);
                currentElement.setLink(new String(ch, start, length));
                parsingLink = false;
             }
        }
    }
}

方法setTitle(String str)setLink(String str)是类的设置方法RSSItem

我用谷歌搜索了这个问题并在某处阅读以StringBuilder代替使用。因此我尝试使用StringBuilder. (我在使用时已对代码进行了注释StringBuilder)。但后来我开始收到NullPointerException.

有什么建议可以摆脱这个问题吗?

4

2 回答 2

1

从文档

Parser 将调用此方法来报告每个字符数据块。SAX 解析器可以在单个块中返回所有连续的字符数据,也可以将其拆分为多个块;但是,任何单个事件中的所有角色都必须来自同一个外部实体,以便定位器提供有用的信息。

所以很可能你得到了部分数据。一个可能的解决方案可能是:

  if (currentItem != null) {
        //temp.append(ch, start, length);
        String tmpLink = currentElement.getLink();
        tmpLink += new String(ch, start, length);
        currentElement.setLink(tmpLink);

   }

当然currentElement.getLink()应该返回一个空String而不是null引用。

于 2013-04-28T09:40:27.283 回答
0

您的问题是您假设characters方法将处理元素内的所有字符,这是不正确的。

如果有的话,您应该保存新字符并将其与以前的字符连接起来。

使用StringBuilder对你的事业有好处。您只需要处理您拥有的 NPE。

于 2013-04-28T09:39:10.967 回答