Node.js实现文件自动检测并转换为XML的技术咨询
实现Node.js监控文件夹并将多类型文件转XML的解决方案
现有代码的核心局限
你当前的代码仅能处理纯文本文件,直接用utf8编码读取PDF、Excel等二进制文件会导致内容乱码;同时原生fs.watch存在事件重复触发、跨平台兼容性差的问题,也没有针对不同文件类型做解析适配。
改进后的完整实现代码
首先安装依赖:
npm install xmlbuilder chokidar pdf-parse xlsx
import fs from 'fs/promises'; import path from 'path'; import xmlbuilder from 'xmlbuilder'; import chokidar from 'chokidar'; import pdfParse from 'pdf-parse'; import xlsx from 'xlsx'; const sourceFolder = 'back/server/sourceFolder'; const xmlFolder = 'back/server/XMLFolder'; // 异步确保目标文件夹存在 await fs.mkdir(xmlFolder, { recursive: true }); // 根据文件类型解析内容 async function parseFileContent(filePath, ext) { switch (ext.toLowerCase()) { case '.pdf': const pdfBuffer = await fs.readFile(filePath); const pdfData = await pdfParse(pdfBuffer); return pdfData.text; case '.xlsx': case '.xls': const excelBuffer = await fs.readFile(filePath); const workbook = xlsx.read(excelBuffer, { type: 'buffer' }); const firstSheet = workbook.Sheets[workbook.SheetNames[0]]; return xlsx.utils.sheet_to_json(firstSheet, { header: 1 }); case '.txt': return fs.readFile(filePath, 'utf8'); default: throw new Error(`不支持的文件类型:${ext}`); } } // 转换解析后的内容为XML function convertToXML(content) { const root = xmlbuilder.create('file_content', { encoding: 'UTF-8' }); if (Array.isArray(content)) { // 处理Excel表格数据 const sheet = root.ele('sheet'); content.forEach(row => { const rowEle = sheet.ele('row'); row.forEach(cell => { rowEle.ele('cell', cell ?? ''); }); }); } else { // 处理文本/PDF内容 root.ele('text', content); } return root.end({ pretty: true }); } // 监听文件夹新增文件 const watcher = chokidar.watch(sourceFolder, { ignoreInitial: true, // 忽略初始已存在的文件,只监听新增 persistent: true }); watcher.on('add', async (filePath) => { try { const ext = path.extname(filePath); const filename = path.basename(filePath); const content = await parseFileContent(filePath, ext); const xmlContent = convertToXML(content); const xmlFilePath = path.join(xmlFolder, `${filename}.xml`); await fs.writeFile(xmlFilePath, xmlContent); console.log(`文件已转换为XML并保存:${xmlFilePath}`); } catch (err) { console.error(`处理文件失败:${filePath}`, err.message); } }); console.log(`正在监听文件夹:${sourceFolder}`);
关键优化说明
- 替换文件监听库:用
chokidar替代原生fs.watch,解决重复事件触发、跨平台兼容问题,同时支持更精准的文件事件监听 - 多类型文件解析:针对PDF、Excel、文本文件分别引入专用解析库,确保内容正确提取
- 异步化操作:全程使用
async/await和fs/promises,避免同步操作阻塞主线程 - XML结构适配:根据不同文件内容类型生成对应结构的XML(表格数据生成行/节点,文本生成文本节点)
- 错误处理:针对每个步骤添加错误捕获,输出明确的错误信息
- 文件夹递归创建:使用
mkdir { recursive: true }确保目标文件夹及其父目录都能被创建
内容的提问来源于stack exchange,提问作者Abir Gharsalli
相关产品推荐
相关产品推荐

