使用XML2JS javascript读取特定节点的问题

时间:2014-06-30 23:53:12

标签: javascript xml xml-parsing

我正在尝试将一些javascript拉到一起,以便从我网络上的空调中读取信息。我不是开发人员所以可能会遗漏一些东西,因为我正在使用的代码是从这里和其他地方找到的一些例子。当我将它与一些示例服务器一起使用时,我可以让它工作,而不是使用我的XML。

这是XML:

<?xml version="1.0" encoding="UTF-8" ?>
<iZS10.3>
<request>getSystemData</request>
<mac>001ec0a14c2e</mac>
<authenticated>1</authenticated>
<system>
<type>12</type>
<name>MYAIR3</name>
<MyAppRev>7.4</MyAppRev>
<zoneStationHasUnitControl>4</zoneStationHasUnitControl>
<dhcp>1</dhcp>
<ip>192.168.1.200</ip>
<netmask>255.255.255.0</netmask>
<gateway>192.168.1.1</gateway>
<unitcontrol>
<airconOnOff>1</airconOnOff>
<fanSpeed>3</fanSpeed>
<mode>2</mode>    
<unitControlTempsSetting>0</unitControlTempsSetting
<centralActualTemp>20.3</centralActualTemp>
<centralDesiredTemp>24.0</centralDesiredTemp>
<airConErrorCode>    </airConErrorCode>
<activationCodeStatus>0</activationCodeStatus
><numberOfZones>8</numberOfZones>
<maxUserTemp>32.0</maxUserTemp>
<minUserTemp>16.0</minUserTemp>
<availableSchedules>8</availableSchedules>
</unitcontrol>
<zs103TechSettings>
<numberofConstantZones>1</numberofConstantZones>
<zsConstantZone1>1</zsConstantZone1>
<zsConstantZone2>0</zsConstantZone2>
<zsConstantZone3>0</zsConstantZone3>
<tempSensorSelect>0</tempSensorSelect>
<returnAirOffset>0.0</returnAirOffset>
<controlZoneNumber>0</controlZoneNumber>
<newAirFitted>0</newAirFitted>
<ACinfo>0</ACinfo>
<systemID>16</systemID>
</zs103TechSettings>
</system>
</iZS10.3>

我的代码:

var options = {
   hostname: '192.168.1.200',
   port: 80,
   path: '/getSystemData',
   method: 'GET'
};


var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (systemdata) {
parseString(systemdata,{trim:true,childkey:9,explicitArray:false,explicitChildren:false}, 
function (err, result) {
           var output= (result);
           console.dir (output);
           console.log(JSON.stringify(result, null, 4));
          console.log("End");
       });
    });
});

req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
});
req.end();

你会注意到我的var输出只写在这里以带回结果。如果我这样做,它成功地带回XML输出的第一个节点。如果我试图让它带回一个特定的元素,即

var output= (result.iZS10.3.system.unitcontrol.centralActualtemp);

给出

    /Users/Documents/workspace/XML Stream/xml2js.js:43
          var output= (result.iZS10.3.system.unitcontrol.centralActualtemp);
                                   ^^
SyntaxError: Unexpected number
    at Module._compile (module.js:439:25)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

我有没有办法在输出行格式化这个?

如果我只是要求没有节点的结果。

{ 'iZS10.3': 
   { request: 'getSystemData',
     mac: '001ec0a14c2e',
     authenticated: '1',
     system: 
      { type: '12',
        name: 'MYAIR3',
        MyAppRev: '7.4',
        zoneStationHasUnitControl: '4',
        dhcp: '1',
        ip: '192.168.1.200',
        netmask: '255.255.255.0',
        gateway: '192.168.1.1',
        unitcontrol: [Object],
        zs103TechSettings: [Object] } } }

我的stringify带回了每个级别和属性,没有任何问题。

console.log(JSON.stringify(result, null, 4));

1 个答案:

答案 0 :(得分:0)

result.iZS10.3.system表示以下结构:

result: {
    iZS10: {
        3: {
            system: ...
        }
    }
}

您可能正在寻找result["iZS10.3"].system,这意味着以下结构:

result: {
    iZS10.3: {
        system: ...
    }
}

初始方法中的问题是点用于处理嵌套属性,但您的.3是属性名称的一部分,而不是属性本身。您可以使用如上所示的数组表示法来解决它。