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

如何用Axios读取并解压Zip包中XML文件为字符串数组?

解决Zip包中XML文件提取为字符串数组的问题

你遇到的Error: Invalid filename核心原因是axios默认将响应解析为UTF-8字符串,而Zip是二进制文件,转成字符串会破坏原有结构,导致解压缩库无法识别。解决第一步就是让axios返回二进制Buffer。

修正axios配置 + 使用adm-zip实现需求

直接修改axios的请求配置,添加responseType: 'arraybuffer',然后用adm-zip处理Buffer,遍历所有文件筛选出XML,读取内容转为字符串存入数组:

const axios = require('axios');
const AdmZip = require('adm-zip');

const conf = {
  headers: {
    "Content-Type": "application/zip",
  },
  auth: {
    username: "username",
    password: "password",
  },
  // 关键配置:让axios返回二进制Buffer
  responseType: 'arraybuffer'
};

try {
  const res = await axios.get("url", conf);
  const zip = new AdmZip(res.data);
  const zipFiles = [];

  // 遍历zip中的所有文件
  zip.getEntries().forEach(entry => {
    // 筛选XML文件(排除目录,只处理文件)
    if (!entry.isDirectory && entry.name.endsWith('.xml')) {
      // 将文件内容转为字符串,存入数组
      const xmlContent = entry.getData().toString('utf8');
      zipFiles.push(xmlContent);
    }
  });

  console.log(zipFiles);
  // 输出格式:["<?xml version...", "<?xml version...", ...]
} catch (e) {
  console.log(e);
}

备选方案:使用jszip实现

如果你更倾向于jszip,同样需要axios返回arraybuffer,然后按以下方式处理:

const axios = require('axios');
const JSZip = require('jszip');

const conf = {
  headers: {
    "Content-Type": "application/zip",
  },
  auth: {
    username: "username",
    password: "password",
  },
  responseType: 'arraybuffer'
};

try {
  const res = await axios.get("url", conf);
  const zip = await JSZip.loadAsync(res.data);
  const zipFiles = [];

  // 遍历所有文件
  for (const fileName of Object.keys(zip.files)) {
    const file = zip.files[fileName];
    // 跳过目录,只处理XML文件
    if (!file.dir && fileName.endsWith('.xml')) {
      const xmlContent = await file.async('string');
      zipFiles.push(xmlContent);
    }
  }

  console.log(zipFiles);
} catch (e) {
  console.log(e);
}

关键注意点

  • 必须设置responseType: 'arraybuffer',确保axios返回的是二进制Buffer,而非被转码的字符串
  • 筛选文件时要判断isDirectory(adm-zip)或dir(jszip),避免把目录当成文件处理
  • XML文件编码如果不是UTF-8,可以在toString()时指定对应编码(比如toString('gbk'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:05:24