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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:24