这是我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Server SYSTEM "Server.dtd">
<Server>
<MaximumUserNumber>2</MaximumUserNumber>
<ServerPortNumber>1234</ServerPortNumber>
<MessagesQueueSize>5</MessagesQueueSize>
</Server>
这是我的Server.dtd:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT Server
(MaximumUserNumber,
ServerPortNumber,
MessagesQueueSize)>
<!ELEMENT MaximumUserNumber (#PCDATA)>
<!ELEMENT ServerPortNumber (#PCDATA)>
<!ELEMENT MessagesQueueSize (#PCDATA)>
这是我的代码,它给了我一个NullPointerException:
public Server() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);
Document document = dbf.newDocumentBuilder().parse("config.xml");
document.normalizeDocument();
NodeList nl = document.getElementsByTagName("MaximumUserNumber");
nl.item(0); // this line causes exception
}
}
我做错了什么?谢谢!
答案 0 :(得分:1)
你的代码看起来不错。
它甚至不会在jdk-7上抛出任何异常。也许,你没有包含那些代码。
你刚才没有再找到元素的价值:
NodeList nodeList = document.getElementsByTagName("MaximumUserNumber");
Node foundNode = nodeList.item(0);
Node textNode = foundNode.getChildNodes().item(0);
String value = textNode.getNodeValue();
System.out.println(value);
输出
2
解释
document.getElementsByTagName("MaximumUserNumber")
返回NodeList。它有一个找到的节点。每个元素节点(type == ELEMENT_NODE)即使它只包含文本也有子节点。在这种情况下,唯一的子节点是TEXT_NODE类型的节点:Node textNode = foundNode.getChildNodes().item(0);
。从这种类型的节点中你可以得到它的价值。
有一种更快捷的方法可以从仅文本元素中获取文本值:
NodeList nodeList = document.getElementsByTagName("MaximumUserNumber");
Node foundNode = nodeList.item(0);
String value = foundNode.getTextContent();
System.out.println(value);
此处,.getTextContent()
返回此节点及其后代的文本内容。
这两种情况都不是很安全(没有空检查或节点类型检查),但如果使用模式可能会被认为是这样。