StAX 是 java 中内存高效且易用的 xml 流式解析方式,通过 XMLInputFactory 创建 XMLEventReader“拉取”事件,支持 START_ELEMENT、CHARACTERS 等事件遍历,也可用 XMLOutputFactory 和 XMLEventWriter 写入 XML,需捕获 XMLstreamException 并用try-with-resources 及时释放资源。

StAX(Streaming API for XML)是 Java 中处理 XML 的流式解析方式,相比 dom 更省内存,比 SAX 更易用——它让你“拉”数据而不是被动“被推”,控制权在你手上。
创建 XMLInputFactory 并获取 XMLEventReader
这是 StAX 解析的起点。你需要先拿到一个事件读取器,它会逐个返回 XML 中的元素、属性、文本等事件:
- 调用 XMLInputFactory.newinstance() 创建工厂实例
- 用 factory.createXMLEventReader(InputStream) 或 createXMLEventReader(Reader) 获取读取器
- 注意:默认可能不支持外部 DTD 或 命名空间,如有需要,可设置 factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false)
遍历 XMLEventReader 获取关键事件
通过 hasNext() 和 nextEvent()(或 next())逐个读取事件,常用类型有:
- START_ELEMENT:进入开始标签,可用 asStartElement().getName().getLocalPart() 获取标签名
- CHARACTERS:获取文本内容,建议用 isIgnorableWhiteSpace() 过滤空白符
- END_ELEMENT:匹配结束标签,可用于判断结构闭合
- Attribute:在 START_ELEMENT 事件中,用 asStartElement().getAttributes() 遍历属性
用 XMLEventWriter 写 XML(可选但实用)
StAX 也支持输出。创建 XMLOutputFactory 和 XMLEventWriter 后,可主动写入事件:
立即学习“Java 免费学习笔记(深入)”;
- 用 writer.add(eventFactory.createStartDocument()) 开始文档
- 用 eventFactory.createStartElement(…) 和 writer.add() 写开始标签
- 别忘了 writer.add(eventFactory.createEndElement(…)) 和 createEndDocument()
- 写完记得 writer.flush() 和 writer.close()
处理异常与资源释放
StAX 操作可能抛出 XMLStreamException,必须捕获;输入流和事件读取器也要及时关闭:
- 推荐用 try-with-resources 包裹 InputStream 和 XMLEventReader
- 若手动管理,确保在 finally 块中调用 reader.close()
- 遇到格式错误(如标签不闭合),XMLStreamException 会带具体位置信息,方便定位问题