【问题标题】:Elegant way to transform CSV to XML in Node/Express在 Node/Express 中将 CSV 转换为 XML 的优雅方式
【发布时间】:2020-07-19 16:54:45
【问题描述】:

我正在寻找一种优雅的解决方案,将基于特定模板的 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. 这只是众多模板类型中的一小部分

【问题讨论】:

    标签: javascript node.js xml csv express


    【解决方案1】:

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

    【讨论】:

    • 谢谢你,但这种方法的警告是你必须手动解析和转换单个字段,我正在寻找可以基于 XSD 自动构建 XML 的东西。
    猜你喜欢
    • 2013-06-03
    • 2014-10-11
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    相关资源
    最近更新 更多