我有一个NODEJS程序,它使用xml2js将XML文件转换为JSON并解析它。然后我试图循环遍历json对象并为每个对象显示ID,LastReportTime但是我得到的输出是未定义的
输出
2015-02-26T18:45:35.34-0500 [App/0] OUT BESAPI
2015-02-26T18:45:35.34-0500 [App/0] OUT Computer
2015-02-26T18:45:35.34-0500 [App/0] OUT Computer:undefined
2015-02-26T18:45:35.34-0500 [App/0] OUT Done
的NodeJS
var fs = require('fs'),
xml2js = require('xml2js');
var parser = new xml2js.Parser();
fs.readFile('myfile.xml', function(err, data) {
parser.parseString(data, function (err, result) {
var jsoniem = JSON.stringify(result);
console.log(jsoniem);
var data = JSON.parse(jsoniem);
for (var obj in data) {
if (data.hasOwnProperty(obj)) {
console.log(obj);
console.log("\n \n");
if (obj == "BESAPI") {
for (var prop in data[obj]) {
console.log(prop);
if (prop == "Computer") {
console.log(prop + ':' + data[obj][prop].ID);
console.log(prop + ':' + data[obj][prop].LastReportTime);
}
}
}
}
}
console.log('Done');
});
Json(程序从XML转换为JSON后)
{
"BESAPI": {
"$": {
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xsi:noNamespaceSchemaLocation": "BESAPI.xsd"
},
"Computer": [
{
"$": {
"Resource": "api/computer/2431038"
},
"LastReportTime": [
"Thu, 26 Feb 2015 14:54:41 +0000"
],
"ID": [
"2431038"
]
},
{
"$": {
"Resource": "api/computer/16710075"
},
"LastReportTime": [
"Thu, 26 Feb 2015 14:45:18 +0000"
],
"ID": [
"16710075"
]
},
{
"$": {
"Resource": "api/computer/3415985"
},
"LastReportTime": [
"Thu, 26 Feb 2015 14:50:52 +0000"
],
"ID": [
"3415985"
]
}
]
}
}
XML
<?xml version="1.0" encoding="UTF-8"?>
<BESAPI xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="BESAPI.xsd">
<Computer Resource="api/computer/2431038">
<LastReportTime>Thu, 26 Feb 2015 14:54:41 +0000</LastReportTime>
<ID>2431038</ID>
</Computer>
<Computer Resource="api/computer/16710075">
<LastReportTime>Thu, 26 Feb 2015 14:45:18 +0000</LastReportTime>
<ID>16710075</ID>
</Computer>
<Computer Resource="api/computer/3415985">
<LastReportTime>Thu, 26 Feb 2015 14:50:52 +0000</LastReportTime>
<ID>3415985</ID>
</Computer>
</BESAPI>
答案 0 :(得分:4)
考虑你的JSON示例迭代对象似乎无关紧要。此外,不需要首先对数据进行字符串化,然后解析字符串。
fs.readFile('myfile.xml', function(err, data) {
parser.parseString(data, function (err, result) {
var jsoniem = JSON.stringify(result);
console.log(jsoniem);
result.BESAPI.Computer.forEach(function (el) {
// Output arrays
console.log(el.ID);
console.log(el.LastReportTime);
// Get first elements
console.log(el.ID[0]);
console.log(el.LastReportTime[0]);
});
}
console.log('Done');
});
答案 1 :(得分:1)
似乎你没有迭代计算机阵列。尝试更改内部循环,如下所示:
for (var prop in data[obj]) {
console.log(prop);
if (prop == "Computer") {
for( var cmp in data[obj][prop] ) {
console.log(prop + ':' + cmp.ID[0]);
console.log(prop + ':' + cmp.LastReportTime[0]);
}
}
}
更新根据您的JSON将数组表示法添加到ID和LastReportTime
答案 2 :(得分:1)
你又错过了一个循环,因为Computer属性是一个数组数组:
if (obj == "BESAPI") {
for (var prop in data[obj]) {
console.log(prop);
if (prop == "Computer") {
// loop over Computer dataseries
for(var id in data[obj][prop]) {
console.log(prop + ':' + data[obj][prop][id].ID);
console.log(prop + ':' + data[obj][prop][id].LastReportTime);
}
}
}
答案 3 :(得分:1)
在阅读JSON元素时,我们需要处理索引和数组
for(var i=0; i <data.BESAPI.Computer.length; i++ ){
var computerData = data.BESAPI.Computer[i];
alert(computerData.LastReportTime);
}
解决了这个问题。你甚至可以看到工作FIDDLE
答案 4 :(得分:1)
问题原因是你未定义
对象数据[obj] [prop]是一个数组而不是一个对象
所以,再次得到你错过的那个数组中的每个对象, 刚刚修改了你的内心&#34;如果&#34;块。
var fs = require('fs'),
xml2js = require('xml2js');
var parser = new xml2js.Parser();
fs.readFile('myfile.xml', function(err, data) {
parser.parseString(data, function (err, result) {
var jsoniem = JSON.stringify(result);
console.log(jsoniem);
var data = JSON.parse(jsoniem);
for (var obj in data) {
if (data.hasOwnProperty(obj)) {
console.log(obj);
console.log("\n \n");
if (obj == "BESAPI") {
for (var prop in data[obj]) {
console.log(prop);
if (prop == "Computer") {
for (var propKeys in prop) {
if(data[obj] && data[obj][prop] && data[obj][prop][0]) {
console.log(prop, data[obj][prop][0].ID);
console.log(prop, data[obj][prop][0].LastReportTime);
}
}
}
}
}
}
}
console.log('Done');
});
});