Java DOM 解析器错误

标签 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

          }
}

我做错了什么?谢谢!

最佳答案

您的代码看起来不错。

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

这两种情况都不是真正安全的(没有空检查或节点类型检查),但如果与模式一起使用,则可以被视为安全。

关于Java DOM 解析器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989307/

相关文章:

java - Java中如何持续分配内存直到分配完3GB?

c# - 简单数据结构的最轻序列化方法

java - 针对 XSD 的 XML 验证 : cvc-complex-type. 2.4.a

python - 从打开的文件中获取行号 python

javax.script.ScriptEngine 在运行时失败

Java SWT 库在 Windows 10 中的糟糕布局

c - 解析 C 文件

javascript - 如何从 HTTP 响应 header 字符串中提取参数?

java - HOUR_OF_DAY 为值 0 和 1 设置相同的小时

c# - 如何为 List<Custom> 实现设置 XmlArrayItem 元素名称?