【问题标题】:Convert XML to JSON with NodeJS使用 NodeJS 将 XML 转换为 JSON
【发布时间】:2019-02-16 06:44:52
【问题描述】:

我正在尝试将以下 xml 转换为 json,因此我需要获取到 TS-tc-dt 的映射

这里是xml

<?xml version="1.0" encoding="UTF-8"?>
<TestScenario>
   <TestSuite name="TS_EdgeHome">
      <TestCaseName name="tc_Login">dt_EdgeCaseHome,dt_EdgeCaseRoute</TestCaseName>
      <TestCaseName name="tc_Logout">dt_EdgeCaseRoute</TestCaseName>
   </TestSuite>
   <TestSuite name="TS_EdgePanel">
      <TestCaseName name="tc_AddContract">dt_EdgeCaseHome,dt_EdgeCaseSpectrum</TestCaseName>
   </TestSuite>
      <TestSuite name="TS_EdgeRoute">
      <TestCaseName name="tc_VerifyContract">dt_EdgeCaseRoute</TestCaseName>
      <TestCaseName name="tc_Payment">dt_EdgeCaseRoute</TestCaseName>
   </TestSuite>
   <TestSuite name="TS_EdgeSpectrum">
      <TestCaseName name="tc_ClientFeedback">dt_EdgeCaseSpectrum</TestCaseName>
   </TestSuite>
</TestScenario>

如何在 NodeJS 中实现这一点?

【问题讨论】:

标签: json node.js xml npm


【解决方案1】:

我使用xml-js - npm 来获得想要的结果。

首先我通过npm install xml-js安装了xml-js

然后使用下面的代码得到json格式的输出

var convert = require('xml-js');
var xml = require('fs').readFileSync('./testscenario.xml', 'utf8');

var result = convert.xml2json(xml, {compact: true, spaces: 4});
console.log(result);

【讨论】:

  • 我在接受的答案中尝试了该包,但出现此错误:xml 格式不正确,但 xml-js 包运行良好。谢谢
【解决方案2】:

您可以使用xml2json npm 将您的 xml 转换为 json。 xml2json

第 1 步:- 在你的项目中安装包

npm install xml2json

第 2 步:- 您可以使用该软件包并将您的 xml 转换为 json

let xmlParser = require('xml2json');
let xmlString = `<?xml version="1.0" encoding="UTF-8"?>
<TestScenario>
   <TestSuite name="TS_EdgeHome">
      <TestCaseName name="tc_Login">dt_EdgeCaseHome,dt_EdgeCaseRoute</TestCaseName>
      <TestCaseName name="tc_Logout">dt_EdgeCaseRoute</TestCaseName>
   </TestSuite>
   <TestSuite name="TS_EdgePanel">
      <TestCaseName name="tc_AddContract">dt_EdgeCaseHome,dt_EdgeCaseSpectrum</TestCaseName>
   </TestSuite>
      <TestSuite name="TS_EdgeRoute">
      <TestCaseName name="tc_VerifyContract">dt_EdgeCaseRoute</TestCaseName>
      <TestCaseName name="tc_Payment">dt_EdgeCaseRoute</TestCaseName>
   </TestSuite>
   <TestSuite name="TS_EdgeSpectrum">
      <TestCaseName name="tc_ClientFeedback">dt_EdgeCaseSpectrum</TestCaseName>
   </TestSuite>
</TestScenario>`;

console.log('JSON output', xmlParser.toJson(xmlString));

希望这对你有帮助。

【讨论】:

    【解决方案3】:

    如果您在 xml2json 和 xml-js 之间进行选择,那么据我所知,区别在于:

    • xml-js 的依赖少得多,使用 sax-js 进行 xml 解析。
    • xml2json 具有更多依赖项,包括需要 python 的 node-expat,并且在 npm i 期间可能会令人头疼。但 node-expat 声称比 sax-js 快约 3 倍。

    还要注意 xml2json 和 xml-js 生成的 JSON 略有不同。当我用 xml-js 替换 xml2json 时,我不得不在属性值所在的任何地方添加“._attributes”。

    【讨论】:

      【解决方案4】:

      在 6 条简单的 ES6 行中:

      xml2json = xml => {                                                                                                                                                     
        var el = xml.nodeType === 9 ? xml.documentElement : xml                                                                                                               
        var h  = {name: el.nodeName}                                                                                                                                          
        h.content    = Array.from(el.childNodes || []).filter(e => e.nodeType === 3).map(e => e.textContent).join('').trim()                                                  
        h.attributes = Array.from(el.attributes || []).filter(a => a).reduce((h, a) => { h[a.name] = a.value; return h }, {})                                                 
        h.children   = Array.from(el.childNodes || []).filter(e => e.nodeType === 1).map(c => h[c.nodeName] = xml2json(c))                                                    
        return h                                                                                                                                                              
      }
      

      使用echo "xml2json_example()" | node -r xml2json.es6 进行测试,源地址为https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

      【讨论】:

      • 这会丢失混合内容和元素排序(无论如何,属性排序由解析器选择)。无论如何,许多人拒绝混合内容......这不是问题,只是一些用户可能会关心。
      【解决方案5】:

      Cruftless 允许您“注释”要匹配的数据结构,以指定应如何将其绑定到相同数据的 JSON 表示。

      所以,如果你这样定义你的模板:

      <TestScenario>
        <TestSuite name="{{name}}"><?bind suites|array?>
          <TestCaseName name="{{name}}">{{data}}</TestCaseName><?bind cases|array?>
        </TestSuite>
      </TestScenario>
      

      然后在从它创建的对象上调用.fromXML,传入你要解析的XML,你会得到:

      {
        suites: [
          { name: 'tc_Logout', data: 'dt_EdgeCaseRoute' },
          {
            name: 'tc_AddContract',
            data: 'dt_EdgeCaseHome,dt_EdgeCaseSpectrum'
          },
          { name: 'tc_Payment', data: 'dt_EdgeCaseRoute' },
          { name: 'tc_ClientFeedback', data: 'dt_EdgeCaseSpectrum' }
        ]
      }
      

      【讨论】:

        【解决方案6】:

        你也可以试试camaro

        const { transform } = require('camaro')
        
        const xml = `
        <?xml version="1.0" encoding="UTF-8"?>
        <TestScenario>
           <TestSuite name="TS_EdgeHome">
              <TestCaseName name="tc_Login">dt_EdgeCaseHome,dt_EdgeCaseRoute</TestCaseName>
              <TestCaseName name="tc_Logout">dt_EdgeCaseRoute</TestCaseName>
           </TestSuite>
           <TestSuite name="TS_EdgePanel">
              <TestCaseName name="tc_AddContract">dt_EdgeCaseHome,dt_EdgeCaseSpectrum</TestCaseName>
           </TestSuite>
              <TestSuite name="TS_EdgeRoute">
              <TestCaseName name="tc_VerifyContract">dt_EdgeCaseRoute</TestCaseName>
              <TestCaseName name="tc_Payment">dt_EdgeCaseRoute</TestCaseName>
           </TestSuite>
           <TestSuite name="TS_EdgeSpectrum">
              <TestCaseName name="tc_ClientFeedback">dt_EdgeCaseSpectrum</TestCaseName>
           </TestSuite>
        </TestScenario>
        `
        
        ;(async function () {
            const result = await transform(xml, {
                testSuites: [
                    '/TestScenario/TestSuite',
                    {
                        name: '@name',
                        testCases: ['TestCaseName', {
                            name: '@name',
                            data: '.'
                        }]
                    }
                ]
            })
        
            console.log(JSON.stringify(result, null, 2))
        })()
        

        输出:

        {
          "testSuites": [
            {
              "name": "TS_EdgeHome",
              "testCases": [
                {
                  "name": "tc_Login",
                  "data": "dt_EdgeCaseHome,dt_EdgeCaseRoute"
                },
                {
                  "name": "tc_Logout",
                  "data": "dt_EdgeCaseRoute"
                }
              ]
            },
            {
              "name": "TS_EdgePanel",
              "testCases": [
                {
                  "name": "tc_AddContract",
                  "data": "dt_EdgeCaseHome,dt_EdgeCaseSpectrum"
                }
              ]
            },
            {
              "name": "TS_EdgeRoute",
              "testCases": [
                {
                  "name": "tc_VerifyContract",
                  "data": "dt_EdgeCaseRoute"
                },
                {
                  "name": "tc_Payment",
                  "data": "dt_EdgeCaseRoute"
                }
              ]
            },
            {
              "name": "TS_EdgeSpectrum",
              "testCases": [
                {
                  "name": "tc_ClientFeedback",
                  "data": "dt_EdgeCaseSpectrum"
                }
              ]
            }
          ]
        }
        

        【讨论】:

          【解决方案7】:

          var fs = require('fs');
          
          var xml2json = require('xml2js');
          
          var parser = new xml2json.Parser();
          var i = 0;
          fs.readFile('note.xml', function(err,data){
              parser.parseString(data, function(err, result){  
                  console.log(result);
              });
          });

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          【解决方案8】:

          如果你有一个 XML 文件,那么你可以在 nodejs 中使用fs 读取那个 XML 文件,然后你可以使用“xml2json”npm 包。

              const parser = require('xml2json');
              const fs = require("fs")
          
          
          
              fs.readFile(uploadedFilePath, function(err,data){
          
                  if(err) {
                      return res.send({message:err});
                  } else {
          
                      jsonfile = JSON.parse(parser.toJson(data,{reversible: true}));
          
                  }
          
              });
          

          【讨论】:

          • 已经有一个答案建议使用相同的工具并附上解释。
          猜你喜欢
          • 2015-12-20
          • 1970-01-01
          • 2014-08-02
          • 2015-04-11
          • 2010-09-16
          • 2020-01-26
          • 2022-01-07
          • 2015-04-11
          • 2021-05-20
          相关资源
          最近更新 更多