Java DOM中Node和Element有什么区别

Node是DOM所有节点类型的总称,Element是其子类型,专指HTML/XML标签元素;二者共享通用方法,但Element额外提供标签专属功能,且getNodeType()返回1。

Node 是 DOM 中所有节点类型的总称,Element 是 Node 的子类型,专指 XML 或 HTML 中的标签元素(比如

)。

Node 是 DOM 的基础抽象

DOM 把整个文档看作一棵节点树,每个组成部分都继承自 Node 接口。它包括:元素(Element)、属性(Attr)、文本(Text)、注释(Comment)、文档(Document)、文档片段(DocumentFragment)等。所有这些类型共享一些通用方法和属性,比如:

  • getParentNode()getChildNodes()getNodeType()
  • getNodeName()getNodeValue()(具体含义依节点类型而异)
  • appendChild()removeChild() 等操作树结构的方法

Element 代表具体的标签节点

Element 继承自 Node,所以它具备所有 Node 的能力,但额外提供了面向“标签”的专属功能:

  • getTagName()(返回标签名,如 "DIV"
  • getAttribute(String name)setAttribute(String name, String value)
  • getElementsByTagName(String tag)getElementsByClassName(String className)
  • hasAttribute(String name)removeAttribute(String name)

注意:Element 节点的 getNodeType() 返回常量 Node.ELEMENT_NODE(值为 1),而文本节点是 Node.TEXT_NODE(值为 3),注释节点是 8,等等。

常见混淆点

很多人以为 getElementsByTagName() 返回的是 Element 对象,其实它返回的是 NodeList,其中每个项是 Node 类型 —— 但运行时实际是 Element 实例。所以你可以安全地向下转型:

Node node = nodeList.item(0);
if (node instanceof Element) {
    Element elem = (Element) node;
    String id = elem.getAttribute("id");
}

不过更推荐用 getElementsByTagName() 直接获取 Element 列表(Java 9+ 支持泛型 NodeList,但老版本仍需转型);另外,像 getTextContent() 这类方法定义在 Node 上,所以 Element 也能调用,但它会递归拼接所有子孙文本节点的内容。

简单判断技巧

区分一个节点是不是元素,可以这样判断:

  • getNodeType() == Node.ELEMENT_NODE
  • 或用 node instanceof Element
  • 避免只靠 getNodeName().startsWith(" 这类字符串判断 —— 不可靠也不规范

Element 一定是 Node,但 Node 不一定是 Element。