复杂Javascript对象解析
我有一个xml作为javascript对象。xml看起来像:复杂Javascript对象解析,javascript,xml-parsing,Javascript,Xml Parsing,我有一个xml作为javascript对象。xml看起来像: <map-Map> <map-Entry> <map-Key> <std-String value="responseMessage"></std-String> </map-Key> <map-Value>
<map-Map>
<map-Entry>
<map-Key>
<std-String value="responseMessage"></std-String>
</map-Key>
<map-Value>
<std-String value="success"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="lastName"></std-String>
</map-Key>
<map-Value>
<std-String value="Page"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="phone"></std-String>
</map-Key>
<map-Value>
<std-String value="860-634-1602"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="fax"></std-String>
</map-Key>
<map-Value>
<std-String value="860-429-5183"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="email"></std-String>
</map-Key>
<map-Value>
<std-String value="larry.page@gmail.com"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="name"></std-String>
</map-Key>
<map-Value>
<std-String value="Alphabets Inc."></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="altPhone"></std-String>
</map-Key>
<map-Value>
<std-String value="860-429-0021"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="billingAddress"></std-String>
</map-Key>
<map-Value>
<map-HashMap>
<map-Entry>
<map-Key>
<std-String value="postalCode"></std-String>
</map-Key>
<map-Value>
<std-String value="94043"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="addr1"></std-String>
</map-Key>
<map-Value>
<std-String value="1600 Amphitheatre Pkwy"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="addr2"></std-String>
</map-Key>
<map-Value>
<std-String value="Mountain View"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="state"></std-String>
</map-Key>
<map-Value>
<std-String value="California"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="country"></std-String>
</map-Key>
<map-Value>
<std-String value="Unites States"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="city"></std-String>
</map-Key>
<map-Value>
<std-String value="California"></std-String>
</map-Value>
</map-Entry>
</map-HashMap>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="dummyList"></std-String>
</map-Key>
<map-Value>
<col-LinkedList>
<std-String value="a"></std-String>
<std-String value="b"></std-String>
<std-String value="c"></std-String>
</col-LinkedList>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="firstName"></std-String>
</map-Key>
<map-Value>
<std-String value="Larry"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="companyName"></std-String>
</map-Key>
<map-Value>
<std-String value="Google"></std-String>
</map-Value>
</map-Entry>
<map-Entry>
<map-Key>
<std-String value="contact"></std-String>
</map-Key>
<map-Value>
<std-String value="sundar.pichai@gmail.com"></std-String>
</map-Value>
</map-Entry>
</map-Map>
{
'map-Map':{
'map-Entry':{
'map-Key':{
'std-String':{attributes:{value:'firstName'}}
},
'map-Value':{
'std-String':{attributes:{value:'Larry'}}
}
}
}
};
我想将其转换为简单的键值对,例如:
{'responseMessage':'success', 'lastName':'Page', 'billingAddress':{'postalCode':'321021','addr1':'Mountain View'},'firstName':'Larry'}
请帮助我用逻辑来解析和创建类似的东西,如果它是通用的,这将是很好的,因为节点的嵌套可以在那里。提前谢谢
编辑我尝试使用递归,虽然我是新手,但这将进入一个无限循环:
function processedResult(map){
var resultMap = {};
var mapEntry = map['map-Entry'];
for(x=0; x<mapEntry.length; x++){
var value = '';
var child = mapEntry[x];
var key = child['map-Key']['std-String']['attributes']['value'];
var valueNode = child['map-Value'];
if(Object.keys(valueNode)[0] == 'std-String'){
value = valueNode['std-String']['attributes']['value'];
}else if(Object.keys(valueNode)[0] == 'map-HashMap'){
value = processedResult(valueNode['map-HashMap']);
}
resultMap[key] = value;
}
return resultMap;
}
将JS对象馈送给此对象时,我陷入了无限循环:
var parse = function (node, obj) {
//console.dir(node);
var hashMap;
// ..
if ( Object.keys(node)[0] === "map-Map" ) {
console.log('inside map-Map');
parse(node["map-Map"],obj);
return obj;
}
// ..
if ( Object.keys(node)[0] === "map-HashMap" ) {
console.log('inside map-HashMap');
//console.log(node);
hashMap = {};
_.each(node, function (node) {
console.log(node);
parse(node, hashMap);
});
//parse(node["map-HashMap"]["map-Entry"], hashMap);
return hashMap;
}
// ..
if ( Object.keys(node)[0] === "col-LinkedList" ) {
console.log('inside col-LinkedList');
return _.reduce(node, function (linkedList, node) {
linkedList.push(parse(node, {}));
return linkedList;
}, []);
}
// ..
if ( Object.keys(node)[0] === "map-Entry" ) {
console.log('inside map-Entry');
console.log(node["map-Entry"]);
for(a=0; a<node["map-Entry"].length; a++){
obj[parse(node["map-Entry"][a]["map-Key"], obj)] = parse(node["map-Entry"][a]["map-Value"], obj);
}
//obj[parse(node["map-Key"], obj)] = parse(node["map-Value"], obj);
return obj;
}
// ..
if ( Object.keys(node)[0] === "map-Key" ) {
console.log('inside map-Key');
return parse(node["map-Key"][0], obj);
}
// ..
if ( Object.keys(node)[0] === "map-Value" ) {
console.log('inside map-Value');
return parse(node["map-Value"][0], obj);
}
// ..
if ( Object.keys(node)[0] === "std-String" ) {
console.log('inside std-String');
return node["std-String"]["attributes"]["value"];
}
};
var parse=函数(节点,obj){
//console.dir(节点);
var-hashMap;
// ..
if(对象键(节点)[0]=“映射”){
log(“内部地图”);
解析(节点[“映射”],obj);
返回obj;
}
// ..
if(Object.keys(节点)[0]=“map HashMap”){
log('insidemap HashMap');
//console.log(节点);
hashMap={};
_.每个(节点、功能(节点){
console.log(节点);
解析(节点,hashMap);
});
//解析(节点[“映射HashMap”][“映射条目”],HashMap);
返回hashMap;
}
// ..
if(对象键(节点)[0]=“列链接列表”){
log('insidecollinkedlist');
return u.reduce(节点,函数(linkedList,节点){
push(解析(节点,{}));
返回linkedList;
}, []);
}
// ..
if(对象键(节点)[0]=“映射项”){
console.log(“内部地图条目”);
日志(节点[“映射条目]);
对于(a=0;avar parse=function)(节点,obj){
console.dir(节点);
var-hashMap;
// ..
如果(node.tagName==“映射”){
_.每个(节点.子节点,函数(节点){
解析(node,obj);
});
返回obj;
}
// ..
if(node.tagName==“映射HashMap”){
hashMap={};
_.每个(节点.子节点,函数(节点){
解析(节点,hashMap);
});
返回hashMap;
}
// ..
if(node.tagName==“col LinkedList”){
return u.reduce(node.children,函数(linkedList,node){
push(解析(节点,{}));
返回linkedList;
}, []);
}
// ..
if(node.tagName==“映射项”){
obj[parse(node.children[0],obj)]=parse(node.children[1],obj);
返回obj;
}
// ..
if(node.tagName==“映射键”){
返回解析(node.children[0],obj);
}
// ..
if(node.tagName==“映射值”){
返回解析(node.children[0],obj);
}
// ..
如果(node.tagName==“标准字符串”){
返回node.getAttribute(“值”);
}
};
var-str='';
var parser=新的DOMParser();
var xml=parser.parseFromString(str,“text/xml”);
log(JSON.stringify(parse(xml.children[0],{}),null,4));
我正在处理xml文档及其节点,但原理应该与解析的JS obj相同。试着检查一下,让我知道它是否可以理解
不确定它是否是cross brwser,应该在chrome中工作
请参阅u.each和u.reduce expl.能否为源代码提供完整的JS对象XML@RadekMichna谢谢你的回复。我已经在我的问题中添加了整个JS对象。很抱歉,它的格式不正确。好的,谢谢。请看我的answer@RadekMichna嗨,只有一个问题,node.children是否表示该节点的直接子节点?你可以用任何例子来解释。这里你可以检查整个API:。例如:有两个孩子:和。我正在用'dir'函数将节点打印到控制台。如果你点击控制台日志中的任何节点,你可以看到它的整个结构…完美!…它在chrome上也工作得很好..非常感谢!
var parse = function (node, obj) {
//console.dir(node);
var hashMap;
// ..
if ( Object.keys(node)[0] === "map-Map" ) {
console.log('inside map-Map');
parse(node["map-Map"],obj);
return obj;
}
// ..
if ( Object.keys(node)[0] === "map-HashMap" ) {
console.log('inside map-HashMap');
//console.log(node);
hashMap = {};
_.each(node, function (node) {
console.log(node);
parse(node, hashMap);
});
//parse(node["map-HashMap"]["map-Entry"], hashMap);
return hashMap;
}
// ..
if ( Object.keys(node)[0] === "col-LinkedList" ) {
console.log('inside col-LinkedList');
return _.reduce(node, function (linkedList, node) {
linkedList.push(parse(node, {}));
return linkedList;
}, []);
}
// ..
if ( Object.keys(node)[0] === "map-Entry" ) {
console.log('inside map-Entry');
console.log(node["map-Entry"]);
for(a=0; a<node["map-Entry"].length; a++){
obj[parse(node["map-Entry"][a]["map-Key"], obj)] = parse(node["map-Entry"][a]["map-Value"], obj);
}
//obj[parse(node["map-Key"], obj)] = parse(node["map-Value"], obj);
return obj;
}
// ..
if ( Object.keys(node)[0] === "map-Key" ) {
console.log('inside map-Key');
return parse(node["map-Key"][0], obj);
}
// ..
if ( Object.keys(node)[0] === "map-Value" ) {
console.log('inside map-Value');
return parse(node["map-Value"][0], obj);
}
// ..
if ( Object.keys(node)[0] === "std-String" ) {
console.log('inside std-String');
return node["std-String"]["attributes"]["value"];
}
};
var parse = function (node, obj) {
console.dir(node);
var hashMap;
// ..
if ( node.tagName === "map-Map" ) {
_.each(node.children, function (node) {
parse(node, obj);
});
return obj;
}
// ..
if ( node.tagName === "map-HashMap" ) {
hashMap = {};
_.each(node.children, function (node) {
parse(node, hashMap);
});
return hashMap;
}
// ..
if ( node.tagName === "col-LinkedList" ) {
return _.reduce(node.children, function (linkedList, node) {
linkedList.push(parse(node, {}));
return linkedList;
}, []);
}
// ..
if ( node.tagName === "map-Entry" ) {
obj[parse(node.children[0], obj)] = parse(node.children[1], obj);
return obj;
}
// ..
if ( node.tagName === "map-Key" ) {
return parse(node.children[0], obj);
}
// ..
if ( node.tagName === "map-Value" ) {
return parse(node.children[0], obj);
}
// ..
if ( node.tagName === "std-String" ) {
return node.getAttribute("value");
}
};
var str = '<map-Map><map-Entry><map-Key><std-String value="responseMessage"></std-String></map-Key><map-Value><std-String value="success"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="lastName"></std-String></map-Key><map-Value><std-String value="Page"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="phone"></std-String></map-Key><map-Value><std-String value="860-634-1602"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="fax"></std-String></map-Key><map-Value><std-String value="860-429-5183"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="email"></std-String></map-Key><map-Value><std-String value="larry.page@gmail.com"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="name"></std-String></map-Key><map-Value><std-String value="Alphabets Inc."></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="altPhone"></std-String></map-Key><map-Value><std-String value="860-429-0021"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="billingAddress"></std-String></map-Key><map-Value><map-HashMap><map-Entry><map-Key><std-String value="postalCode"></std-String></map-Key><map-Value><std-String value="94043"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="addr1"></std-String></map-Key><map-Value><std-String value="1600 Amphitheatre Pkwy"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="addr2"></std-String></map-Key><map-Value><std-String value="Mountain View"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="state"></std-String></map-Key><map-Value><std-String value="California"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="country"></std-String></map-Key><map-Value><std-String value="Unites States"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="city"></std-String></map-Key><map-Value><std-String value="California"></std-String></map-Value></map-Entry></map-HashMap></map-Value></map-Entry><map-Entry><map-Key><std-String value="dummyList"></std-String></map-Key><map-Value><col-LinkedList><std-String value="a"></std-String><std-String value="b"></std-String><std-String value="c"></std-String></col-LinkedList></map-Value></map-Entry><map-Entry><map-Key><std-String value="firstName"></std-String></map-Key><map-Value><std-String value="Larry"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="companyName"></std-String></map-Key><map-Value><std-String value="Google"></std-String></map-Value></map-Entry><map-Entry><map-Key><std-String value="contact"></std-String></map-Key><map-Value><std-String value="sundar.pichai@gmail.com"></std-String></map-Value></map-Entry></map-Map>';
var parser = new DOMParser();
var xml = parser.parseFromString(str, "text/xml");
console.log(JSON.stringify(parse(xml.children[0], {}), null, 4));