【问题标题】:Why am I required to verify if a node is an instance of an Element?为什么我需要验证节点是否是元素的实例?
【发布时间】:2021-04-18 21:20:05
【问题描述】:

我制作了一个简单的 XML 文件,我正在尝试打印子节点。我已经设法做到了,但它只有在我首先验证我的 person 节点是 Element 的实例时才有效。我认为元素是节点的实例。

我在下面的代码中所做的只是从名为 nameList 的 NodeList 中获取每个项目并将其转换为一个元素,以便我可以将它们打印到标准输出。如果我不检查 person 是否是 Element 的实例,为什么会出现异常(java.lang.ClassCastException)?

提前致谢!

// Get the child nodes tag names from the root element
    System.out.println("These are the names in child nodes: ");
    NodeList nameList = element.getChildNodes();
    for(int i = 0; i < nameList.getLength(); i++) {
        Node person = nameList.item(i);
        if (person instanceof Element){
            Element name = (Element)person;
            System.out.println(name);
        }
    }

【问题讨论】:

  • 如果你无论如何都进行强制转换,你会得到一个异常(可能是 ClassCastException),因此你的 NodeList 中有不是元素的节点。因为如果它们是元素,你就不会得到例外。所以问题是——它们是什么?为什么不添加一个“else”子句来打印它们是什么(比如类名)?
  • 如果不检查person 是否为Element 对象,会出现什么异常?哪一行会产生你得到的异常?
  • 假设您正在使用来自 org.w3c.dom 包的类:虽然每个 Element 也是一个 Node 是正确的,但反之则不正确:不是每个 Node 都是Element - 可能是 AttrComment 或其他。
  • 抛出的异常是第 7 行的 java.lang.ClassCastException “元素名称 = (Element)person;”

标签: java xml element instanceof


【解决方案1】:

根据JavaDocs,您说Element 扩展Node 是正确的,但它不是node 的唯一子类

这本质上意味着在您的NodeList 中可能存在另一个扩展 Node 的对象,它不是元素,即 w3c.Notation

尝试将任何不是Element 或其子类的类强制转换为Element 会导致ClassCastException。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    相关资源
    最近更新 更多