我会尝试尽可能清楚地说明这一点,虽然我不确定我会成功。
我在Android中实现了一个DOM解析器,根据找到的一些代码here来解析典型的RSS提要。它适用于我尝试过的几乎所有Feed,但是我在Blogger网站的某个Feed上的某个帖子上遇到了theString = nchild.item(j).getFirstChild().getNodeValue();
行(我的代码更低)的NullPointerException。我知道这只是这篇文章,因为我重写了循环以忽略这个帖子并且错误没有出现并且解析继续正常。在实际的RSS提要中查看这篇文章时,似乎这篇文章完全用HTML编写(而不仅仅是标准文本),而其他帖子则不是。
这是问题的原因,还是我应该继续寻找?如果这确实是问题,我将如何解决它?有没有办法忽略以这种方式编写的帖子?我已经尝试过寻找替代和尝试的替代示例,但似乎每个人都在他们的教程中使用相同的基本代码。
我所指的帖子只是一个链接,以及<div>
标签内的几行彩色文字和一些不同的字体。我会在这里发布,但我不确定Feed的所有者是否会要求我(如果能够,我会询问并更新。)
我的解析器:
try {
// Create required instances
DocumentBuilderFactory dbf;
dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
// Parse the xml
Document doc = db.parse(new InputSource(url.openStream()));
doc.getDocumentElement().normalize();
// Get all <item> tags.
NodeList nl = doc.getElementsByTagName("item");
int length = nl.getLength();
for (int i = 0; i < length; i++) {
Node currentNode = nl.item(i);
RSSItem _item = new RSSItem();
NodeList nchild = currentNode.getChildNodes();
int clength = nchild.getLength();
for (int j = 1; j < clength; j = j + 2) {
Node thisNode = nchild.item(j);
String theString = null;
String nodeName = thisNode.getNodeName();
theString = nchild.item(j).getFirstChild().getNodeValue();
if (theString != null) {
if ("title".equals(nodeName)) {
_item.setTitle(theString);
} else if ("description".equals(nodeName)) {
_item.setDescription(theString);
} else if ("pubDate".equals(nodeName)) {
String formatedDate = theString.replace(" +0000", "");
_item.setDate(formatedDate);
} else if ("author".equals(nodeName)) {
_item.setAuthor(theString);
}
}
}
_feed.addItem(_item);
}
} catch (Exception e) {
e.printStackTrace();
}
return _feed;
}
正如我所提到的,我更改了文本以忽略导致问题的(第三)帖子:
if(i != 3){
if (theString != null) {
if ("title".equals(nodeName)) {
_item.setTitle(theString);
} else if ("description".equals(nodeName)) {
_item.setDescription(theString);
} else if ("pubDate".equals(nodeName)) {
String formatedDate = theString.replace(" +0000", "");
_item.setDate(formatedDate);
} else if ("author".equals(nodeName)) {
_item.setAuthor(theString);
}
}
}
这导致一切按预期工作,只是跳过第三篇文章。对此有任何帮助表示赞赏,我一直在寻找一段时间没有运气。我发布了我的logcat,但是在我在Q开头粘贴的行之后,由于它返回AsyncTask,它不是很有用。
哦,我正在考虑解决它的方法之一就是首先解析描述而不是标题(当然重写循环),并在继续解析之前检测它是否等于NULL
。虽然它很混乱,所以我正在寻找替代方案。
答案 0 :(得分:1)
查看您要解析的HTML代码。我几乎可以肯定,第三篇文章没有孩子。这是,为空。例如,此节点会抛出异常:
<Element></Element>
因此,在检查节点是否有任何子节点之前,必须避免调用getNodeValue
:
theString = nchild.item(j).getFirstChild().getNodeValue();
为了避免这种情况,你可以做类似的事情:
if (nchild.item(j).getFirstChild() != null)
//and your code
//...