Java读取XML主要有DOM、SAX和StAX三种方式:DOM适合中小型文件并支持随机访问;SAX为事件驱动,内存占用低但不可回溯;StAX是拉模式,兼顾灵活性与效率,适用于需精细控制的场景。

Java读取XML文件主要有DOM、SAX和StAX三种方式,其中DOM最常用,适合中小型XML文件,能随机访问任意节点;SAX适合大文件流式解析,内存占用低;StAX则是拉模式解析,兼顾灵活性与效率。选择哪种方式,取决于XML大小、是否需要修改、以及对内存和性能的要求。
使用DOM解析读取XML并获取节点
DOM会将整个XML加载进内存构建成树形结构,适合需要频繁查询、修改或回溯的场景。核心步骤是:创建DocumentBuilder → 解析XML得到Document → 用getElementsByTagName或XPath定位节点 → 提取内容或属性。
- 调用document.getElementsByTagName("tagName")返回NodeList,遍历后用node.getTextContent()获取文本值
- 用node.getAttributes().getNamedItem("attrName")读取属性值
- 若需精准定位,推荐配合javax.xml.xpath.XPath使用,例如xpath.compile("//book/title").evaluate(doc, XPathConstants.NODE)
用SAX解析处理大型XML文件
SAX是事件驱动型解析器,不构建内存树,而是通过回调方法(如startElement、endElement、characters)逐行响应标签。适合GB级日志类XML,内存友好但无法回退或随机访问。
- 需自定义继承DefaultHandler的处理器类,重写关键方法
- 在startElement中识别开始标签,记录当前路径或状态标志(如isInTitle = true)
- 在characters中捕获字符数据,注意前后可能有空白符,建议用new String(ch, start, length).trim()
StAX拉模式解析——更可控的流式读取
StAX像“用迭代器读XML”,程序主动调用next()或nextTag()推进解析位置,比SAX更直观,也支持写入。
立即学习“Java免费学习笔记(深入)”;
- 用XMLInputFactory.newInstance().createXMLEventReader(file)创建读取器
- 循环判断event.getEventType(),遇到START_ELEMENT时检查event.asStartElement().getName().getLocalPart()
- 遇到CHARACTERS事件时,用event.asCharacters().getData()获取文本内容
注意事项与常见问题
中文乱码多因未指定编码,解析时需确保输入流以UTF-8(或对应编码)打开;空节点或换行符会导致getTextContent()返回空白字符串,建议trim后判空;XPath表达式错误或命名空间未声明会返回null,调试时可先打印document.getDocumentElement().getNodeName()确认根节点。










