需求:若干文件夹中有若干文件,读取到每一个文件夹中的xml文件中的name和id组成一个新的json文件。json
文件结构以下图:数组
var xmlreader = require("xmlreader");var fs = require("fs");var path = require("path");var filePath = path.resolve('../xmlReader/forth');
// 全局变量var SymbolArray = [];
// 调用方法fileDisplay(filePath);
function fileDisplay(filePath) { fs.readdir(filePath, function (err, files) { if (err) { console.warn(err); } else { files.forEach(function (filename) { // fileDir 文件夹路径 var fileDir = path.join(filePath, filename);
fs.stat(fileDir, function (err, stats) { if (null !== err) { console.log(err); } else { var isFile = stats.isFile(); var isDir = stats.isDirectory(); if (isDir) { fileDisplay(fileDir); } if (isFile) { // 过滤.xml文件 if (path.extname(filename) === '.xml') { fs.readFile(fileDir, 'utf-8', function (err, data) { if (err) { console.log(err); return; } var xml_string = data; var SymbolData; var totals = []; // 读文件取属性 xmlreader.read(xml_string, function (err, response) { let count = response.Symbols.Symbol.count(); // 处理文件中个数为1的文件(个数为1没有array属性) if (count > 1) { SymbolData = response.Symbols.Symbol.array; } else { SymbolData = [response.Symbols.Symbol]; } for (let sym of SymbolData) { var total = sym.attributes(); totals.push(total); } for (let total of totals) { // 格式化数据位数 total.code = PrefixInteger(total.code, 4); console.log(total.code); var SymbolJson = { "name": total.name, "id": total.LibId + total.code }; SymbolArray.push(SymbolJson); } // 删除因遍历文件夹而重复的对象(也可用Lodash去重) var newSymbolArray = deleteRepeat(SymbolArray); // 写文件在指定目录 fs.writeFile('../xmlReader/week.json', JSON.stringify(newSymbolArray), 'utf-8', function (err, res) { if (err) { console.error(err); } }); }); }); } } } }); }); } });}
// 对json数组去重function deleteRepeat(arr) { for (var i = 0; i < arr.length - 1; i++) { var old = arr[i]; for (var j = i + 1; j < arr.length; j++) { if (old.name === arr[j].name && old.id === arr[j].id) { arr.splice(j, 1); j--; } } } return arr;}
// 指定数据位数function PrefixInteger(num, length) { return (Array(length).join('0') + num).slice(-length);}复制代码