如何在Node服务端将xml.gz格式文件转换为JSON格式
完全可以在Node服务端实现xml.gz格式到JSON的转换,整体流程分为拉取压缩流、gzip解压、XML转JSON三个核心环节,以下是可直接落地的实现方案:
1. 依赖准备
你需要用到三个工具,其中zlib是Node内置模块无需额外安装:
axios:发起GET请求,原生支持流式响应处理zlib:Node内置的gzip解压模块xml2js:生态内广泛使用的XML转JSON工具,兼容性好
安装命令:npm install axios xml2js
2. 完整实现代码
const axios = require('axios'); const zlib = require('zlib'); const { parseString } = require('xml2js'); const { promisify } = require('util'); // 将xml2js的回调式API转为Promise风格,方便异步调用 const parseXml = promisify(parseString); async function xmlGzToJson(apiUrl) { try { // 1. 发起请求获取二进制流,声明支持gzip压缩 const res = await axios.get(apiUrl, { responseType: 'stream', headers: { 'Accept-Encoding': 'gzip' } }); // 2. 管道连接gzip解压流,处理压缩内容 const gunzipStream = zlib.createGunzip(); const xmlDataStream = res.data.pipe(gunzipStream); // 拼接解压后的完整XML内容 let xmlContent = ''; for await (const chunk of xmlDataStream) { xmlContent += chunk.toString('utf8'); } // 3. XML转JSON,可根据实际需求调整转换配置 const jsonResult = await parseXml(xmlContent, { trim: true, // 自动去掉标签内容前后的空格 explicitArray: false, // 单个子节点不强制包裹为数组 explicitRoot: false, // 不保留XML根节点的外层包装 mergeAttrs: true // 合并XML标签属性到节点值中 }); return jsonResult; } catch (err) { console.error('处理失败:', err); throw err; } } // 调用示例 // xmlGzToJson('你的目标接口地址').then(data => console.log(data))
3. 优化说明
- 如果接口返回的数据量极大,不想一次性加载到内存,可以替换
xml2js为sax这类流式XML解析库,边解压边解析边处理,内存占用会降低90%以上 - 若解压后出现乱码,可调整
chunk.toString的编码参数,比如改为gbk,和接口返回的内容编码对齐即可 - 转换后的JSON结构可以通过调整
parseXml的配置参数修改,适配不同的XML返回格式
内容的提问来源于stack exchange,提问作者willmahon
相关产品推荐
相关产品推荐

