我正在尝试从URL读取此XML文件:

<updates>
    <plugin name="PluginName">
        <latest>0.7</latest>
        <url>[PLUGIN URL]</url>
        <notes>
            [UPDATE NOTES]
        </notes>
        <message/>
    </plugin>
</updates>


这是我阅读文档的Java代码:

private Document getXML(){

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

    dbf.setIgnoringElementContentWhitespace(true);

    Document doc = null;
    try {
        DocumentBuilder db = dbf.newDocumentBuilder();
        try {
            doc = db.parse(new URL(XML_URL).openStream());
            System.out.println("Successfully read XML from URL");
            return doc;
        } catch (MalformedURLException e) {
            log(Level.SEVERE, "Update URL was borked");
            e.printStackTrace();
        } catch (SAXException e) {
            log(Level.SEVERE, "I don't even know what happened here");
            e.printStackTrace();
        } catch (IOException e) {
            log(Level.SEVERE, "Something in your connection broke");
            e.printStackTrace();
        }
    } catch (ParserConfigurationException e) {
        log(Level.SEVERE, "Unable to create Parsing Document, complain to developers");
        e.printStackTrace();
    }

    return doc;

}


然后,此方法返回的Document对象将传递到对此方法进行解析:

private double extractVersion(Document doc){

    Node pluginsNode = doc.getFirstChild();
    Node pluginNode = pluginsNode.getFirstChild();

    while(pluginNode.hasAttributes() && !pluginNode.getAttributes().getNamedItem("name").equals(PLUGIN_NAME)){
        pluginNode = pluginNode.getNextSibling();
    }

    Node child = pluginNode.getFirstChild();
    System.out.println("Child: "+child);
    System.out.println("Pnode:" + pluginNode);
    while (!child.getNodeName().equals("latest")){
        child = child.getNextSibling();
        if(child == null){
            System.out.println("SOMETHING HAPPENED");
        }
    }

    String latest = child.getFirstChild().getNodeValue();

    return Double.parseDouble(latest);
}


每当我运行代码时,我最终都会在此行中得到空指针异常:

while (!child.getNodeName().equals("latest")){

我已经改变了几个小时,试图在其他地方寻求帮助,但是我不知道发生了什么,为什么我会得到一个空指针异常。

最佳答案

尝试使用getTextContent()代替getNodeName()。看看是否有帮助。

getNodeName()只是根据节点的类型而不是其内容返回一个String

编辑

尝试

while (child != null && !child.getNodeName().equals("latest")) {
    child = child.getNextSibling();
}


编辑

以上所有方法均无效。

我认为真正的问题在这里:

Node pluginsNode = doc.getFirstChild();


尝试将其替换为:

Node pluginsNode = (Node)doc.getDocumentElement();


根据this问题。

编辑

经过一些调试后,以下是解决方案:

private double extractVersion(Document doc){

String result = "";

NodeList nodeList = doc.getElementsByTagName("latest");
for (int i = 0; i < nodeList.getLength(); i++) {
    Node node = nodeList.item(i);
    if (node.getNodeName().equals("latest")) {
        result = node.getTextContent();
    }
}

return Double.parseDouble(result);
}

08-06 22:35