【问题标题】:JSON to XML conversion in Node JS service (using xml2js)Node JS 服务中的 JSON 到 XML 转换(使用 xml2js)
【发布时间】:2020-05-29 04:41:40
【问题描述】:

我需要一些关于 Node js 中 JSON 到 XML 转换的帮助/建议。 我有一个服务,它在需要转换为 XML 的请求正文中获取 JSON 对象。我可以使用node-xml2js 来实现这一点,用于具有最多一级嵌套对象的 json 输入。但是,对于具有属性值的嵌套对象,它变得更加复杂。应首先识别属性,以 $ 符号为前缀并用大括号括起来,然后再通过 xml2js 解析以获取正确的 xml。 有没有更好的方法可以简化重新格式化 json 输入的复杂层? xml2js 可以转换这个:

{
    "Level1":{  "$":{   "attribute":"value" },
                "Level2": {"$":{"attribute1":"05/29/2020",
                            "attribute2":"10","attribute3":"Pizza"}}
}

对此:(这是正确的):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Level1 attribute="value">
  <Level2 attribute1="05/29/2020" attribute2="10" attribute3="Pizza"/>
</Level1>

但实际的 json 输入是这样的:

{
    "Level1":{"attribute":"value",
              "Level2": {"attribute1":"05/29/2020",
                         "attribute2":"10","attribute3":"Pizza"} }
}

预期相同的结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Level1 attribute="value">
  <Level2 attribute1="05/29/2020" attribute2="10" attribute3="Pizza"/>
</Level1>

如果您曾处理过类似的要求,请告诉我。感谢任何帮助。 谢谢你。

【问题讨论】:

    标签: node.js json xml-parsing xml2js xml-builder


    【解决方案1】:

    这将是一种将对象更改回库中预期格式的方法,尽管它假定所有非对象键都应该是属性(这对您的应用程序来说是一个有效的假设吗?)

    function groupChildren(obj) {
      for(prop in obj) {
        if (typeof obj[prop] === 'object') {
          groupChildren(obj[prop]);
        } else {
          obj['$'] = obj['$'] || {};
          obj['$'][prop] = obj[prop];
          delete obj[prop];
        }
      }
    
      return obj;
    }
    

    然后像这样使用:

    var xml2js = require('xml2js'); 
    var obj = {
      Level1: {
        attribute: 'value',
        Level2: {
          attribute1: '05/29/2020',
          attribute2: '10',
          attribute3: 'Pizza'
        }
      }
    };
    
    var builder = new xml2js.Builder();
    var xml = builder.buildObject(groupChildren(obj));
    

    打印出来的:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Level1 attribute="value">
      <Level2 attribute1="05/29/2020" attribute2="10" attribute3="Pizza"/>
    </Level1>
    

    【讨论】:

    • 谢谢戴夫。它对我来说非常有效,因为我的场景中只有属性,所以我接受这个作为正确答案。但是,我想在某些时候尝试为元素增强它。再次感谢。
    【解决方案2】:

    你可以使用这个库:nashwaan/xml-js

    像这样:

      let xmlJ=require('xml-js');
      let parseToJson=(xml)=>{
            return new Promise(resolve => {
                  let convert;
             
                  convert=xmlJ.xml2json(xml,{compact:true});
                  resolve(convert);
        
       });
     };
    

    【讨论】:

      猜你喜欢
      • 2018-02-08
      • 2013-08-17
      • 1970-01-01
      • 2020-03-12
      • 2018-01-19
      • 2016-07-27
      • 2017-08-05
      • 2019-08-10
      • 2020-04-13
      相关资源
      最近更新 更多