documentbuilderfactory配合dom解析器本质是构建可遍历修改的内存节点树(document对象),支持加载xml文件或从零生成结构,关键在工厂配置、安全防护、节点导航及空白文本处理。

DocumentBuilderFactory 配合 DOM 解析器,本质是构建一棵可遍历、可修改的内存节点树(Document 对象),既支持加载已有 XML/HTML 文件,也支持从零生成新结构。关键不在“能不能”,而在于工厂配置、解析安全、节点导航逻辑和文本节点干扰处理这四点。
加载 XML 文件并构建完整内存树
核心流程固定:工厂 → 解析器 → 输入流 → Document → 根节点 → 递归遍历。但实际中容易卡在路径、编码或空白文本节点上。
- 用
DocumentBuilderFactory.newInstance()获取工厂,**不要手动 new**;它会自动适配系统默认 JAXP 实现(如 Xerces) - 务必调用
doc.getDocumentElement().normalize()—— 这一步合并相邻文本节点、清理换行缩进带来的冗余TEXT_NODE,否则遍历时会多出大量空节点 - 读取文件推荐用
Class.getResourceAsStream("/data.xml"),避免硬编码路径;若用FileInputStream,需确保文件存在且编码为 UTF-8(XML 声明里写明encoding="UTF-8") - 获取子节点时,别直接用
getChildNodes()循环全部项——它包含元素节点(ELEMENT_NODE)、文本节点(TEXT_NODE)、注释等。应先判断node.getNodeType() == Node.ELEMENT_NODE
安全加载:防 XXE 与外部实体攻击
默认 DocumentBuilderFactory 允许加载外部 DTD 和实体,存在 XXE 漏洞风险。生产环境必须禁用:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)—— 禁用 DOCTYPE 声明 factory.setFeature("http://xml.org/sax/features/external-general-entities", false)factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false)factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true)- 额外建议:
factory.setXIncludeAware(false)和factory.setExpandEntityReferences(false)
从零生成 XML 内存树(非解析,而是构建)
DocumentBuilderFactory 不仅用于解析,还能创建空文档,配合 DOM API 动态构造结构:
- 调用
builder.newDocument()得到一个空Document - 用
doc.createElement("root")创建根元素,再用doc.appendChild(root)挂载 - 逐层添加子元素:
Element child = doc.createElement("item"); root.appendChild(child); - 设属性:
child.setAttribute("id", "101");设文本内容:child.setTextContent("Hello")(注意不是appendChild(doc.createTextNode(...)),后者易引入多余空白) - 生成后可序列化输出:用
TransformerFactory+DOMSource+StreamResult写入文件或字符串
处理 HTML?谨慎对待
标准 DOM 解析器(JAXP)专为格式严格、合法的 XML 设计。直接解析常见 HTML(含自闭合标签缺失、大小写混用、无根节点等)大概率抛 ParseException。
- 若必须解析 HTML,改用专用库如 jsoup(支持宽容解析、CSS 选择器)或 TagSoup(将 HTML 转为规范 XML 流)
- 若 HTML 已人工转成 XHTML(所有标签闭合、小写、有
根),则 DOM 可用,但需确认 namespace 支持(启用factory.setNamespaceAware(true)) - 不建议强行用 DOM 解析乱序 HTML —— 节点树错位、丢失内容、性能差,得不偿失
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










