将字节数组解析为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组件:
- 添加Maven依赖(若使用Maven):
<dependency> <groupId>org.apache.poi</groupId> <artifactId>hwpf</artifactId> <version>5.2.5</version> </dependency>
- 解析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
相关产品推荐
相关产品推荐

