Java的org.w3c.dom包里有什么

1次阅读

org.w3c.domjava中遵循w3c dom规范的抽象接口包,无实现类,需通过documentbuilder等工厂获取实例;核心接口为document、element、node;text、cdatasection、comment为独立节点类型;domconfiguration等用于高级控制;不提供构造器、工具方法或json支持。

Java的org.w3c.dom包里有什么

org.w3c.dom 是 Java 标准库中用于操作 xml(或 HTML)文档树结构的核心接口包,它不提供实现类,只定义了一套 W3C DOM 规范的抽象接口。你不能直接 new 它里面的任何东西,而是通过 DocumentBuilderDOMImplementation 等工厂类获取具体实现(比如由 JAXP 默认提供的 Xerces 实现)。


核心接口:Document、Element、Node 是骨架

整个包围绕“树形文档模型”组织,最常用的是这三个接口:

  • Document:代表整个 XML 文档,是所有节点的根;通过 DocumentBuilder.parse()DocumentBuilder.newDocument() 获取
  • Element:代表一个标签(如 <user id="1"></user>),可调用 getAttribute("id")getElementsByTagName("name")
  • Node:所有节点类型的父接口(ElementTextCommentAttr继承它),统一了 getParentNode()getChildNodes()appendChild() 等基础操作

注意:NodeList 是动态集合(不是 List<node></node>!),每次调用 getFirstChild() 或遍历时都可能因文档变更而改变内容。


文本与特殊内容:Text、CDATASection、Comment

XML 中的纯文本、注释、CDATA 块在 DOM 中不是字符串,而是独立节点类型:

立即学习Java免费学习笔记(深入)”;

  • Text 接口继承自 CharacterData,表示元素内或属性中的字符数据;可用 getTextContent() 读,setTextContent()
  • CDATASectionText 的子接口,用于包裹不被解析的原始文本(如 JS 代码块);创建需用 Document.createCDATASection()
  • Comment 表示 <!-- ... -->,也是 CharacterData 子类,可读写内容但不会被解析器当成标记处理

常见坑:Element.getTextContent() 会拼接所有后代 Text 节点,但跳过 CommentCDATASection —— 如果你依赖文本顺序,得手动遍历 childNodes 并过滤类型。


辅助接口:DOMConfiguration、UserDataHandler、DOMErrorHandler

这些不是日常 CRUD 必用,但在控制解析/序列化行为或调试时很关键:

  • DOMConfiguration 控制文档如何处理空格、是否校验、是否规范子节点等;例如 doc.getDomConfig().setParameter("normalize-characters", true)
  • UserDataHandler 用于在节点复制、导入时传递自定义对象(比如保留原始行号或上下文元数据),需配合 Node.setUserData() 使用
  • DOMErrorHandler 可注册到 DOMConfiguration,捕获解析错误(如格式错误、命名空间冲突),但默认不抛异常 —— 很多人误以为 XML 解析失败会 throw,其实常静默失败

没实现、没工具类、也没 json 支持

这是最容易误解的一点:org.w3c.dom 包里:

  • ❌ 没有 new DocumentImpl() 这样的构造器 —— 所有实例必须来自工厂(DocumentBuilder / DOMImplementation
  • ❌ 没有类似 XMLUtils.toString(doc) 的便捷方法 —— 序列化 XML 必须用 javax.xml.transformtransformer
  • ❌ 不支持 JSON、YAML 或 html5 特性(如 shadowRoot)—— 它严格对应 W3C DOM Level 2/3 Core 规范,仅限 XML/老式 HTML

如果你看到项目里直接 import org.w3c.dom.* 却没配 DocumentBuilderFactory 或处理 ParserConfigurationException,基本跑不起来 —— 接口再全,没工厂驱动就是一张白纸。

text=ZqhQzanResources