Java DOM解析器错误

时间:2013-04-13 15:17:09

标签: java xml parsing dom dtd

这是我的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

          }
}

我做错了什么?谢谢!

1 个答案:

答案 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()返回此节点及其后代的文本内容。

这两种情况都不是很安全(没有空检查或节点类型检查),但如果使用模式可能会被认为是这样。