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