我正在尝试从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")){
我已经改变了几个小时的东西,并试图在别处获得帮助,但我无法弄清楚发生了什么以及为什么我得到一个空指针异常。
答案 0 :(得分:1)
尝试使用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);
}
答案 1 :(得分:0)
我想当你到达最后一个节点并且根本就没有下一个sibiling时会发生这种情况。根据文件http://docs.oracle.com/javase/1.5.0/docs/api/org/w3c/dom/Node.html#getNextSibling() getNextSibiling和getFirstSibiling可能返回null。您应该检查此调用返回的子项是否为空