先解压再解析XML。C#用GZipStream解压字节流并转字符串,Java用GZIPInputStream或InflaterInputStream读取压缩数据,结合StreamReader或BufferedReader还原为明文XML后,交由XDocument或DocumentBuilder解析;需注意压缩前是否Base64编码及字节序、魔数识别(如1F8B标识GZip)。

在处理XML数据时,有时会遇到经过压缩的XML字符串(如使用GZip或Deflate压缩)。要解析这类内容,必须先解压再进行XML解析。以下是常见的解压XML字符串的方法,适用于C#、Java等主流语言。
1. C# 中解压 GZip 压缩的 XML 字符串
如果XML字符串是通过GZip压缩的,可以使用 red">GZipStream 进行解压:
- 将压缩的字节流读入内存
- 使用 GZipStream 解压成原始字节
- 转换为字符串后用 XDocument 或 XmlDocument 解析
示例代码:
using System.IO;
using System.IO.Compression;
using System.Text;
using System.Xml.Linq;
<p>public static string DecompressGZipXml(byte[] compressedData)
{
using (var memoryStream = new MemoryStream(compressedData))
using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
using (var streamReader = new StreamReader(gzipStream, Encoding.UTF8))
{
return streamReader.ReadToEnd();
}
}</p><p>// 使用
string xmlContent = DecompressGZipXml(compressedBytes);
XDocument doc = XDocument.Parse(xmlContent);
2. Java 中解压 Deflate 或 GZip 的 XML 字符串
Java 提供了 java.util.zip 包来处理压缩数据。根据压缩方式选择 InflaterInputStream(Deflate)或 GZIPInputStream。
示例:解压 GZip 压缩的XML
import java.io.*;
import java.util.zip.GZIPInputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
<p>public static String decompressGZipXml(byte[] compressedData) throws IOException {
ByteArrayInputStream bais = new ByteArrayInputStream(compressedData);
GZIPInputStream gis = new GZIPInputStream(bais);
BufferedReader reader = new BufferedReader(new InputStreamReader(gis, "UTF-8"));
StringBuilder outStr = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
outStr.append(line);
}
return outStr.toString();
}</p><p>// 解析XML
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlString)));
3. 判断是否压缩及常见问题
实际应用中,需确认XML字符串是否真的被压缩,以及使用的压缩算法:
- 查看数据来源文档或API说明
- 检查字节数组前几个字节(魔数):GZip通常以 1F 8B 开头
- 确保编码一致(一般为UTF-8)
- 压缩可能是Base64编码后再传输,需先Base64解码
Base64 + GZip 示例(C#):
byte[] compressedBytes = Convert.FromBase64String(base64String); string xml = DecompressGZipXml(compressedBytes);
基本上就这些。关键是先还原原始XML字符串,再交给标准解析器处理。










