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 会带具体位置信息,方便定位问题










