javascript - 在 Node/Express 中将 CSV 转换为 XML 的优雅方式

标签 javascript node.js xml csv express

我正在寻找一种优雅的解决方案,将基于特定模板的 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>

一些附加说明:

  1. 此 XML 符合由 XSD 定义的架构。
  2. 这只是许多模板类型的一小部分

最佳答案

这是一个基于 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/

相关文章:

javascript - 在第一次 jQuery ajax 调用后重置 jQuery 样式更改

javascript - 如何使用 javascript 将 googlenmapv3 地址转换为 placeId 和 panoId

node.js - 努力使用 gherkin apickli 为 API 获取简单的 BDD 测试套件

ios - 艺术家 ID 的 iTunes Store RSS 提要?

javascript - 当列有多个候选值时,如何在DataTables中进行列搜索?

javascript - D3 图表图例标签重叠

node.js - 使用 AWS JavaScript SDK 和 agent=false 进行快速 S3 操作

node.js - Sequelize 连接表错误 : DatabaseError [SequelizeDatabaseError]: column does not exist

ios - XML解析字符串编码

sql-server - 围绕 xml 或逐行添加 xml 元素的最佳方法