将JavaScript XML DOM对象转换为具有特定结构的对象



我有一个大的XML DOM对象,它通过jQuery的$.parseXML函数解析,返回一个JavaScript DOM对象。使用此XML,我想创建一个具有以下结构的普通JavaScript对象:

{
name: 'my_tree',
children: [
{ name: 'hello' },
{ name: 'wat' },
{
name: 'child_folder',
children: [
{
name: 'child_folder',
children: [
{ name: 'hello' },
{ name: 'wat' }
]
},
{ name: 'hello' },
{ name: 'wat' },
{
name: 'child_folder',
children: [
{ name: 'hello' },
{ name: 'wat' }
]
}
]
}
]
}

原始 XML 如下所示:

<my_tree>
<hello></hello>
<wat></wat>
<child_folder>
<child_folder>
<hello></hello>
<wat></wat>
</child_folder>
<hello></hello>
<wat></wat>
<child_folder>
<hello></hello>
<wat></wat>
</child_folder>
</child_folder>
</my_tree>

我已经尝试了类似于以下代码的东西,但无济于事:

function xmlDomToObject(domObject) {
var result = {children: []};
for (var i = 0; i < domObject.length; i++) {
if (domObject[i].nodeName == "#text") {
continue;
}
result['name'] = domObject[i].nodeName;
result['children'].push(xmlDomToObject(domObject[i].childNodes));
}
return result;
}
var xmlObject = xmlDomToObject(xmlDomObject.childNodes);

一种可能的方法如下。使用children(而不是childNodes(属性允许绕过文本节点并仅检查元素:

function parseXml(node) {
const el = {
name: node.nodeName
};
const children = Array.prototype.map.call(node.children, parseXml);
// ES6: const children = [...node.children].map(parseXml);
if (children.length) {
el.children = children;
}
return el;
}

您可以按原样使用它,只需记住传递$.parseXML结果的属性documentElement而不是结果本身。

const xmlStr = `<my_tree>
<hello></hello>
<wat></wat>
<child_folder>
<child_folder>
<hello></hello>
<wat></wat>
</child_folder>
<hello></hello>
<wat></wat>
<child_folder>
<hello></hello>
<wat></wat>
</child_folder>
</child_folder>
</my_tree>`;
const xml = $.parseXML(xmlStr);
const parsed = parseXml(xml.documentElement);
console.log(parsed);
function parseXml(node) {
const el = {
name: node.nodeName
};
// const children = [...node.children].map(parseXml);
const children = Array.prototype.map.call(node.children, parseXml);
if (children.length) {
el.children = children;
}

return el;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

最新更新