使用 NodeJS 将 XML 转换为 JSON

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/52281389/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 18:54:44  来源:igfitidea点击:

Convert XML to JSON with NodeJS

jsonnode.jsxmlnpm

提问by Dinesh

I'm trying to convert the following xml to json, thereby I need to get a mapping to the TS-tc-dt

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

Here is the xml

这是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>

How can I achieve this in NodeJS?

如何在 NodeJS 中实现这一点?

回答by Dinesh

I've used xml-js - npmto get the desired result.

我已经使用xml-js - npm来获得所需的结果。

First of all I've installed xml-js via npm install xml-js

首先,我通过以下方式安装了 xml-js npm install xml-js

Then used the below code to get the output in json format

然后使用下面的代码得到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);

回答by Dhiral Kaniya

You can use xml2jsonnpm for converting your xml in to json. xml2json.

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

Step 1:- Install package in you project

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

npm install xml2json

npm install xml2json

Step 2:- You can use that package and convert your xml to json

第 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));

Hope this might be helps to you.

希望这可能对您有所帮助。

回答by Stanislav

If you are choosing between xml2json and xml-js then as far as I understand the differences are:

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

  • xml-js has much less dependencies and uses sax-js for xml parsing.
  • xml2json has more dependencies including node-expat that requires python and can be a headache during npm i. But node-expat claims to be ~3 times faster than sax-js.
  • xml-js 的依赖要少得多,并且使用 sax-js 进行 xml 解析。
  • xml2json 具有更多依赖项,包括需要 python 的 node-expat,并且在 npm i 期间可能会令人头疼。但是 node-expat 声称比 sax-js 快约 3 倍。

Also be aware that xml2json and xml-js produce a bit different JSON. When I replaced xml2json with xml-js I had to add "._attributes" everywhere where values were in attributes.

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

回答by Tuan Anh Tran

You can also try camaro

你也可以试试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))
})()

output:

输出:

{
  "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"
        }
      ]
    }
  ]
}

回答by brauliobo

In 6 simple ES6 lines:

在 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                                                                                                                                                              
}

Test with echo "xml2json_example()" | node -r xml2json.es6with source at https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

使用https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6echo "xml2json_example()" | node -r xml2json.es6上的源进行测试

回答by Dushan

if you have a XML file, then you can read that XML file using fsin nodejs and then you can use "xml2json" npm package.

如果您有一个 XML 文件,那么您可以fs在 nodejs 中使用该 XML 文件读取该 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}));

        }

    });

回答by Wilfred Springer

Cruftlessallows you to 'annotate' the data structure you want to match, to specify how it should be bound to a JSON representation of that same data.

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

So, if you define your template like this:

因此,如果您像这样定义模板:

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

Then by calling .fromXMLon the object created from it, passing in the XML you want to parse, you will get:

然后通过调用.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' }
  ]
}