gpt4 book ai didi

java - SAXParser 给出意想不到的随机结果

转载 作者:行者123 更新时间:2023-12-01 14:38:19 27 4
gpt4 key购买 nike

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

enter image description here

这是我的处理程序类:

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

有什么建议可以解决这个问题吗?

最佳答案

来自文档

The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity so that the Locator provides useful information.

所以您可能获得了部分数据 block 。一个可能的解决方案可能是:

  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引用。

关于java - SAXParser 给出意想不到的随机结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261494/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com