使用 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 数组正在删除某些元素的属性