使用DOM解析XML文件,我做错了什么?

时间:2014-09-18 17:16:44

标签: java xml dom

我正在尝试使用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();
        }
    }

}

2 个答案:

答案 0 :(得分:2)

删除for循环语句末尾的分号:

for (temp = 0; temp < nList.getLength(); temp++);

导致循环执行空语句,导致变量temp访问null中的NodeList元素。

此外,在检查XML Feed后,titledescription节点似乎是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.");