推荐使用StAX流式拆分大XML文件,通过XMLStreamReader逐事件解析,捕获目标节点子树(记录深度、透传命名空间与属性),用XMLStreamWriter边读边写至多个小文件,内存恒定几MB。
用Java拆分大XML文件,核心思路是**避免一次性加载整个文件到内存(防止OOM)**,采用流式解析(如SAX或StAX),边读边写,按指定节点边界切分。推荐使用StAX(javax.xml.stream),它比SAX更易控制写入,又比DOM更省内存。
选择StAX进行流式拆分
StAX支持“拉模式”解析(XMLStreamReader)和“推模式”写入(XMLStreamWriter),适合边读边写、动态创建多个输出文件。
- 用XMLStreamReader逐个读取事件(START_ELEMENT、END_ELEMENT等)
- 遇到目标拆分节点(如
)时,新开一个文件,写入XML声明 + 根结构(可选) + 当前节点及其子树 - 用XMLStreamWriter将匹配的节点完整写入对应小文件(注意递归复制子元素、属性、文本、命名空间)
定义拆分边界:按特定开始/结束标签
例如,原始XML为:
A B
你想按每个生成一个独立文件(record_1.xml, record_2.xml)。关键不是只读标签名,而是**捕获从START_ELEMENT到匹配END_ELEMENT之间的完整子树**。
立即学习“Java免费学习笔记(深入)”;