0

0

StAX解析器是什么 如何用流式API来读写XML

畫卷琴夢

畫卷琴夢

发布时间:2026-02-06 09:46:03

|

308人浏览过

|

来源于php中文网

原创

StAX是Java SE 6+内置的标准XML流式处理API,介于DOM与SAX之间,支持拉取式读取(XMLStreamReader)和流式写入(XMLStreamWriter),核心接口位于javax.xml.stream包,无需额外依赖。

stax解析器是什么 如何用流式api来读写xml

StAX解析器到底是什么

StAX(Streaming API for XML)不是某种独立工具或第三方库,而是 Java SE 6+ 内置的、标准的 XML 流式处理 API。它介于 DOM(全量加载内存)和 SAX(纯事件驱动、只读)之间:既支持按需拉取(pull-style),又允许写入;既可控,又轻量。

核心接口是 XMLStreamReader(读)和 XMLStreamWriter(写),都定义在 javax.xml.stream 包里。JDK 自带实现(com.sun.xml.internal.stream.XMLInputFactoryImpl 等),无需额外依赖。

用 XMLStreamReader 逐个读取 XML 元素

与 SAX 不同,StAX 由你主动调用 next()nextTag() 推进解析位置,逻辑更直观,也更容易中断、跳过或条件处理。

常见错误是忽略命名空间或属性顺序,导致 getAttributeValue(null, "id") 返回 null —— 实际上该属性可能在默认命名空间下,或名字拼错。

  • next() 总是前进一位,返回当前事件类型(如 START_ELEMENTCHARACTERS
  • nextTag() 跳过空白和注释,只停在 START_ELEMENT 或 END_ELEMENT
  • 获取属性推荐用 getAttributeValue(namespaceURI, localName),而非靠索引
  • 文本内容必须在 CHARACTERS 事件后调用 getText(),且要检查是否为空白(isWhiteSpace()
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("data.xml"));
while (reader.hasNext()) {
    int event = reader.next();
    if (event == XMLStreamConstants.START_ELEMENT) {
        String name = reader.getLocalName();
        if ("user".equals(name)) {
            String id = reader.getAttributeValue(null, "id"); // 注意 null 表示无命名空间
            System.out.println("Found user id=" + id);
        }
    } else if (event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()) {
        System.out.println("Text: " + reader.getText());
    }
}
reader.close();

用 XMLStreamWriter 写出格式化 XML

XMLStreamWriter 是“流式生成”的关键:不构建树,不缓存整段内容,边写边刷出。适合日志、导出、API 响应等场景。但默认不自动缩进,需手动控制换行和空格。

Yourware
Yourware

专注于AI编程作品部署与分享的云托管平台

下载

容易被忽略的是编码声明和命名空间前缀绑定——如果没调用 writeStartElement("ns", "item", "http://example.com/ns") 就直接写属性,会导致前缀未声明错误。

  • 创建时传入 OutputStream,推荐包装为 OutputStreamWriter 并指定 UTF-8
  • writeStartElement() / writeEndElement() 成对管理标签
  • 属性必须在 START_ELEMENT 之后、END_ELEMENT 之前写,否则抛 XMLStreamException
  • 调用 writeCharacters("\n ") 可模拟缩进,但非标准做法;真正生产环境建议用 IndentingXMLStreamWriter(来自 Woodstox 或自定义装饰器)
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(
    new OutputStreamWriter(System.out, StandardCharsets.UTF_8));
writer.writeStartDocument("UTF-8", "1.0");
writer.writeStartElement("root");
writer.writeAttribute("version", "2.0");
writer.writeStartElement("item");
writer.writeAttribute("id", "101");
writer.writeCharacters("Hello World");
writer.writeEndElement();
writer.writeEndElement();
writer.writeEndDocument();
writer.flush();
writer.close();

读写混合场景:边读边改再写入新文件

这是 StAX 最实用的模式之一,比如清洗 XML 中的敏感字段、升级 schema 版本、过滤特定节点。不能直接在原 XMLStreamReader 上修改,必须用 XMLStreamWriter 重建输出。

关键点在于状态跟踪:你得自己记住当前路径(如 /users/user[2]/email),否则无法判断是否该跳过或替换。没有 XPath 集成,也不能随机访问。

  • 不要试图复用同一个 XMLStreamReader 多次遍历 —— 它是单向流,不可重置
  • 写入前确保目标 OutputStream 已打开,且编码一致(尤其含中文时)
  • 异常处理必须包含 reader.close()writer.close(),建议用 try-with-resources
  • 大文件下注意字符缓冲:writeCharacters(String) 比循环写单字符快得多

StAX 的“流式”本质决定了它不提供树结构、不支持 XPath 查询、也不维护父子关系。所有上下文逻辑都得你自己维护 —— 这既是自由,也是负担。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

585

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

240

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

580

2024.03.01

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1914

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2097

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1099

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1261

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

275

2025.10.17

java连接字符串方法汇总
java连接字符串方法汇总

本专题整合了java连接字符串教程合集,阅读专题下面的文章了解更多详细操作。

22

2026.02.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.3万人学习

C# 教程
C# 教程

共94课时 | 8.7万人学习

Java 教程
Java 教程

共578课时 | 58.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号