需求:若干資料夾中有若干檔案,讀取到每個資料夾中的xml檔案中的name和id組成一個新的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);}複製程式碼