我正在寻找一种优雅的解决方案,将基于特定模板的 CSV 文件转换为 Node/Express 服务器中的分层 XML 文件。
例如:类型模板“位置”的 CSV
Name,Lat,Lon,Timezone
name,lat,lon,timezone
应转换为如下内容:
<Location>
<Name>name<Name/>
<Address>
<Lat>lat</Lat>
<Lon>lon</Lon>
</Address>
<Timezone>timezone</Timezone>
</Location>
一些附加说明:
- 此 XML 符合由 XSD 定义的架构。
- 这只是许多模板类型的一小部分
最佳答案
这是一个基于 CSV 解析器的解决方案 https://github.com/peterthoeny/parse-csv-js创建一个网格(数组的数组),以及一些基于网格生成 XML 的简单代码。此解决方案适用于浏览器以及 Node.js/Express:
function parseCsv(data, fieldSep, newLine) {
fieldSep = fieldSep || ',';
newLine = newLine || '\n';
var nSep = '\x1D';
var qSep = '\x1E';
var cSep = '\x1F';
var nSepRe = new RegExp(nSep, 'g');
var qSepRe = new RegExp(qSep, 'g');
var cSepRe = new RegExp(cSep, 'g');
var fieldRe = new RegExp('(?<=(^|[' + fieldSep + '\\n]))"(|[\\s\\S]+?(?<![^"]"))"(?=($|[' + fieldSep + '\\n]))', 'g');
var grid = [];
data.replace(/\r/g, '').replace(/\n+$/, '').replace(fieldRe, function(match, p1, p2) {
return p2.replace(/\n/g, nSep).replace(/""/g, qSep).replace(/,/g, cSep);
}).split(/\n/).forEach(function(line) {
var row = line.split(fieldSep).map(function(cell) {
return cell.replace(nSepRe, newLine).replace(qSepRe, '"').replace(cSepRe, ',');
});
grid.push(row);
});
return grid;
}
const csv = 'London,0.1278° W,51.5074° N,Europe/London\n'
+ 'New York,74.0060° W,40.7128° N,America/New_York\n';
var grid = parseCsv(csv);
console.log('==> grid: ' + JSON.stringify(grid, null, ' '));
var xml = grid.map(function(row) {
return '<Location>\n'
+ '<Name>' + row[0] + '<Name/>\n'
+ '<Address>\n'
+ '<Lat>' + row[1] + '</Lat>\n'
+ '<Lon>' + row[2] + '</Lon>\n'
+ '</Address>\n'
+ '<Timezone>' + row[3] + '</Timezone>\n'
+ '</Location>\n'
}).join('');
console.log('==> xml:\n' + xml);
控制台输出:
==> grid: [
[
"London",
"0.1278° W",
"51.5074° N",
"Europe/London"
],
[
"New York",
"74.0060° W",
"40.7128° N",
"America/New_York"
]
]
==> xml:
<Location>
<Name>London<Name/>
<Address>
<Lat>0.1278° W</Lat>
<Lon>51.5074° N</Lon>
</Address>
<Timezone>Europe/London</Timezone>
</Location>
<Location>
<Name>New York<Name/>
<Address>
<Lat>74.0060° W</Lat>
<Lon>40.7128° N</Lon>
</Address>
<Timezone>America/New_York</Timezone>
</Location>
关于javascript - 在 Node/Express 中将 CSV 转换为 XML 的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62983186/