You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将字节数组解析为XML文件时序言出现垃圾数据,如何解决?

解决byte数组转XML时出现RTF垃圾数据的问题

你遇到的问题是因为原始byte数组里包含了RTF富文本格式的冗余内容,并非纯XML字节流。那些{\rtf1\ansi...就是RTF文件的头部标识,直接写入文件自然会混入XML结构中。

解决思路

核心是先从byte数组中剥离RTF格式内容,提取出纯XML文本后再写入文件,以下是两种可行方案:

方案1:手动过滤RTF内容(快速解决)

先将byte数组按正确编码转成字符串,定位XML的起始标识(比如<?xml标签),截取之后的纯XML部分再写入文件。修改后的示例代码如下:

import java.io.File;
import java.io.FileWriter;
import java.nio.charset.StandardCharsets;

public static File convertByteArrayToXMLFile(byte[] byteArray, String myFile) {
    String extension = ".xml";
    String filename = myFile + extension;
    File f = new File(filename);

    try {
        // 将byte数组转成字符串(编码根据实际情况调整,示例用UTF-8)
        String content = new String(byteArray, StandardCharsets.UTF_8);
        
        // 定位XML起始位置,剔除RTF垃圾内容
        int xmlStartIndex = content.indexOf("<?xml");
        if (xmlStartIndex != -1) {
            String pureXmlContent = content.substring(xmlStartIndex);
            // 写入纯XML内容到文件
            try (FileWriter writer = new FileWriter(f)) {
                writer.write(pureXmlContent);
            }
        } else {
            // 若找不到<?xml标签,尝试匹配XML根节点起始符,可根据实际结构调整
            int rootStartIndex = content.indexOf("<");
            if (rootStartIndex != -1) {
                String pureXmlContent = content.substring(rootStartIndex);
                try (FileWriter writer = new FileWriter(f)) {
                    writer.write(pureXmlContent);
                }
            } else {
                throw new IllegalArgumentException("无法从byte数组中提取有效XML内容");
            }
        }
        return f;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

方案2:使用RTF解析库(更可靠)

如果RTF结构复杂(比如XML内容被RTF格式标签穿插),手动过滤容易出错,可借助专门的RTF解析库提取纯文本,比如Apache POI的HWPF组件:

  1. 添加Maven依赖(若使用Maven):
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>hwpf</artifactId>
    <version>5.2.5</version>
</dependency>
  1. 解析RTF提取纯XML内容的代码:
import org.apache.poi.hwpf.extractor.WordExtractor;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;

public static File convertByteArrayToXMLFile(byte[] byteArray, String myFile) {
    String extension = ".xml";
    String filename = myFile + extension;
    File f = new File(filename);

    try {
        // 用HWPF解析RTF字节流,提取纯文本内容
        ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
        WordExtractor extractor = new WordExtractor(inputStream);
        String pureXmlContent = extractor.getText();
        extractor.close();
        
        // 写入XML文件
        try (FileWriter writer = new FileWriter(f)) {
            writer.write(pureXmlContent);
        }
        return f;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

注意事项

  • 确认byte数组的编码格式(如UTF-8、GBK等),转字符串时需对应一致,避免出现乱码。
  • 手动截取时需确保不会破坏XML的结构完整性,若XML有特殊格式,优先使用RTF解析库方案。

内容的提问来源于stack exchange,提问作者Funtush

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:11:06