我正在尝试使用DOM解析器从NPR新闻源解析XML文件。我需要将文章的标题和描述显示在GUI上(我还没有写过,试图让它们首先使用system.out)。尝试运行时,我收到错误
java.lang.NullPointerException
at NPRDOM.NPRInfo(NPRDOM.java:26)
at NPRDOM.main(NPRDOM.java:9)
我查找了空指针异常是什么,但我不完全确定我写错了哪一部分。 任何提示或"指针" ; P将非常感激。非常感谢!
//import java.io.*;
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class NPRDOM {
public static void main(String[] args) throws Exception {
NPRInfo();
}
public static void NPRInfo() throws Exception {
try {
//URL XmlFile = new URL("http://www.npr.org/rss/rss.php?id=1001");
DocumentBuilderFactory XmlBuilder = DocumentBuilderFactory.newInstance();
DocumentBuilder xBuilder = XmlBuilder.newDocumentBuilder();
Document xml = xBuilder.parse(new URL("http://www.npr.org/rss/rss.php?id=1001").openStream());
xml.getDocumentElement().normalize();
NodeList nList = xml.getElementsByTagName("channel");
int temp = 0;
for (temp = 0; temp < nList.getLength(); temp++);
Node nNode = nList.item(temp);
System.out.println("Current Element " + nNode.getNodeName());
if (nNode.getNodeType() == Node.ELEMENT_NODE){
Element eElement = (Element) nNode;
System.out.println("Title : " + eElement.getAttribute("title"));
System.out.println("Description : "+ eElement.getAttribute("description"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:2)
删除for
循环语句末尾的分号:
for (temp = 0; temp < nList.getLength(); temp++);
导致循环执行空语句,导致变量temp
访问null
中的NodeList
元素。
此外,在检查XML Feed后,title
和description
节点似乎是channel
节点内的元素,而不是属性。因此,您需要使用getElementsByTagName()
而不是getAttribute()
来检索其值:
System.out.println("Title : "
+ eElement.getElementsByTagName("title").item(0).getChildNodes().item(0).getNodeValue());
System.out.println("Description : "
+ eElement.getElementsByTagName("description").item(0).getChildNodes().item(0).getNodeValue());
当然,您应该检查子节点是否存在(上面假设title
节点始终存在)。
答案 1 :(得分:1)
你至少有两个明显的NPE来源
Document xml = xBuilder.parse(new URL("http://www.npr.org/rss/rss.php?id=1001").openStream());
if(xml==null)
System.out.println("No XML DOM Document retrieved.");
xml.getDocumentElement().normalize();
NodeList nList = xml.getElementsByTagName("channel");
if(nList ==null)
System.out.println("No elements with tag name channel retrieved.");