我正在为Android开发RSS提要阅读器,为了解析XML文件,我使用的是SAX API。问题在于,在解析数据时,一些文本在一些随机选择的标签中以随机方式被截断(我的意思是相同标签的不同实例)。对我来说更清楚,我添加了一个截图。
这是我的Handler类:
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
的setter方法。
我搜索了这个问题,并在某处阅读以使用StringBuilder
。因此我尝试使用StringBuilder
。 (我在使用StringBuilder
时对代码进行了评论)。但后来我开始接收NullPointerException
。
有什么建议摆脱这个问题?
答案 0 :(得分: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
引用。
答案 1 :(得分:0)
您的问题是您假设characters
方法将处理元素内的所有字符,这不是真的。
您应该使用以前的字符保存和连接新字符(如果有的话)。
使用StringBuilder
对您的事业有好处。你只需要处理你所拥有的NPE。