使用 NodeJS 将 XML 转换为 JSON

Posted

技术标签:

【中文标题】使用 NodeJS 将 XML 转换为 JSON【英文标题】:Convert XML to JSON with NodeJS 【发布时间】: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 中实现这一点?

【问题讨论】:

使用 node-xml2js 包。 npmjs.com/package/xml2js 首先,欢迎来到SO!其次,请确保在此处发布问题之前研究您的问题 - 如果问题很重要,它将增加您获得回答和投票的机会。 Any recommendation for xml to json for Node.js?的可能重复 你可以试试 simple-xml-to-json,它非常紧凑,并且没有外部依赖。 npmjs.com/package/simple-xml-to-json 【参考方案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));

        

    );

【讨论】:

已经有一个答案建议使用相同的工具并附上解释。

以上是关于使用 NodeJS 将 XML 转换为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON 将 XML 转换为 PHP 数组正在删除某些元素的属性

nodeJs 转换excel为json

如何将 NodeJs 响应转换为嵌套的 json 响应

如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”

将 JSON 响应转换为 pdf - NodeJS

“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入