【发布时间】:2014-07-18 04:16:09
【问题描述】:
我正在构建一个 xml 到 json 函数,它将我们的 XML 结构转换为特定格式的 JSON。
我尝试了许多库,最终,我决定将 XML 转换为 DOM 树,我可以自己遍历并转换为 JSON,因为这些库不提供我需要的格式。
下面是一个示例 xml 文档:
var xml = '<document>' +
'<divisions>' +
'<division id="123" division="foo">' +
'<departments>' +
'<department id="456" department="bar"/>'+
'<department id="678" department="bar"/>'+
'</departments>' +
'</division>' +
'</divisions>' +
'<roles>' +
'<role id="123" name="foo"/>' +
'<role id="123" name="foo"/>' +
'</roles>' +
'</document>';
期望的输出:
{ divisions: [ { id: '123', division: 'foo', departments: [ { id: '456', department: 'bar' } ] } ], roles: [ { id: '123', name: 'foo'}, { id: '123', name: 'foo'} ] }
这是我最初的尝试:
var DOMParser = require('xmldom').DOMParser;
function XMLtoJSON(xml) {
var json = {};
var dom = new DOMParser().parseFromString(xml).childNodes[0];
function process(nodes, parent) {
var node, name, hasChildren;
for(var i = 0, l = nodes.length; i < l; i++) {
node = nodes[i];
name = node.tagName;
hasChildren = node.hasChildNodes();
if(!parent) {
json[name] = [];
}
if(node.hasAttributes()) {
var attributes = node.attributes, obj = {};
for(var x = 0, al = attributes.length; x < al; x++) {
obj[attributes[x].name] = attributes[x].value;
if(!parent) {
json[name].push(obj);
}
}
}
if(hasChildren) {
process(nodes[i].childNodes);
}
}
}
process(dom.childNodes);
return json;
}
console.log( XMLtoJSON(xml) );
目前,这将输出:
{ divisions: [],
division:
[ { id: '123', division: 'foo' },
{ id: '123', division: 'foo' } ],
departments: [],
department:
[ { id: '678', department: 'bar' },
{ id: '678', department: 'bar' } ],
roles: [],
role: [ { id: '123', name: 'foo' }, { id: '123', name: 'foo' } ] }
注意:我不想在我的 json 中添加父 document,因此初始 parseFromString(xml).childNodes[0];
我想知道是否有人可以帮助我靠近一点。具体来说,我很难理解如何处理嵌入式集合(部门是部门内的一个数组)。我已经为此工作了几个小时,递归一直让我绊倒。
【问题讨论】:
-
我没有看到任何使用
parent参数调用process的地方,所以我很好奇它为什么要测试两次。
标签: javascript xml json node.js