0

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

          }
}

我做错了什么?谢谢!

4

1 回答 1

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")返回一个节点列表。它有一个找到的节点。每个元素节点(类型 == 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()返回此节点及其后代的文本内容。

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

于 2013-04-13T22:05:50.917 回答