DOM解析将XML全载入内存构树,支持随机访问和增删改查,适合中小型文件;缺点是内存占用大、启动慢、不支持流式处理且线程不安全。

Java DOM解析器把整个XML文档加载进内存,构建成一棵树状结构,方便随机访问任意节点。用起来直观,适合中小型XML文件处理。
DOM解析的基本步骤
核心是通过DocumentBuilder读取XML,生成Document对象,再用XPath或节点遍历方式提取数据:
- 获取DocumentBuilderFactory实例,设置是否验证、命名空间等(如setValidating(false))
- 用工厂创建DocumentBuilder,调用parse()方法加载XML(支持File、InputStream、URL)
- 从Document对象出发,用getElementsByTagName()、getFirstChild()、getAttribute()等方法定位元素和属性
- 对文本内容,记得调用getTextContent()或getNodeValue()(注意Text节点才存实际文字)
DOM解析XML的优点
结构清晰,操作灵活,特别适合需要频繁修改、反复查询或跨节点关联的场景:
- 支持随机访问——可随时跳转到任意元素,不用顺序读取
- 天然支持增删改查——能直接在内存树中添加Element、删除Attribute、修改文本
- 便于验证与转换——配合Schema校验,或转成String、写回文件都简单
- 开发体验友好——API稳定,IDE自动补全好,调试时可直接打印Document对象
DOM解析XML的缺点
最大问题是内存开销大,不适合处理大文件或资源受限环境:
立即学习“Java免费学习笔记(深入)”;
- 整个XML必须载入内存——10MB XML可能占用50MB+堆空间(含对象头、引用等)
- 启动慢——解析+建树耗时明显长于SAX或StAX
- 不支持流式处理——无法边读边处理,也不能中断解析或跳过无关部分
- 线程不安全——Document对象不能被多线程并发修改(需自行同步)
实用小技巧与避坑提醒
避免常见错误,提升健壮性和可维护性:
- 解析前建议调用setIgnoringElementContentWhitespace(true),过滤掉纯空白文本节点
- 获取元素值别直接用getChildNodes().item(0).getNodeValue()——可能拿到换行/空格Text节点,优先用getTextContent()
- 涉及命名空间时,DocumentBuilder要设setNamespaceAware(true),否则getElementsByTagname失效
- 大文件慎用——超2MB建议换成SAX或StAX;真要用DOM,可考虑Xerces-C++绑定或限制JVM堆大小
基本上就这些。DOM不是万能钥匙,但对配置文件、小规模数据交换、需要编辑的XML场景,它依然最顺手。










