Hw在nodejs中获取xml属性值

时间:2018-03-13 15:03:36

标签: node.js xml-parsing

我正在使用xml2js

 var fs = require('fs'),
 xml2js = require('xml2js');
 var parser = new xml2js.Parser();
 fs.readFile(path, function(err, data) {
         parser.parseString(data, function (err, result) {
     console.dir(result['QCapsule']['AlarmLog'][0]['AlarmLogItem'][0].AlarmCode);                              });
 });

我的xml文件看起来像

<QCapsule id="1" name="ALARMS">
 ....
 .....
<AlarmLog itemCount="1">
<AlarmLogItem listIndex="0">
  <EntryType>1</EntryType>
  <AlarmCode>180</AlarmCode>
   ....
   ....

的输出
  result['QCapsule']['AlarmLog'][0]['AlarmLogItem'][0].AlarmCode

说[&#39; 180&#39; ]。有没有办法在不使用字符串函数的情况下获得没有[]的值。或者是nodejs有更好的xml解析器。

1 个答案:

答案 0 :(得分:1)

您可以尝试:

var path = 'testxml.xml';
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();

var xml = fs.readFileSync(path);

parser.parseString(xml, function (err, result) {
    if (err) {
        console.error('xml2js.parseString: Error occurred: ', err);
    } else {
        console.log(JSON.stringify(result, null, 2));
        console.log('AlarmCode: ', result.QCapsule.AlarmLog[0].AlarmLogItem[0].AlarmCode[0]); 
    }
});

像这样更改代码,你不需要那些恼人的[0]数组索引操作符。

var path = 'testxml.xml';
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser({explicitArray: false});

var xml = fs.readFileSync(path);

parser.parseString(xml, function (err, result) {
    if (err) {
        console.error('xml2js.parseString: Error occurred: ', err);
    } else {
        console.log(JSON.stringify(result, null, 2));
        console.log('AlarmCode: ', result.QCapsule.AlarmLog.AlarmLogItem[0].AlarmCode);
    }
});

请记住,如果XML数据中有多个子元素,则需要使用索引操作符。

xml2js的“选项”部分还有一些其他有用的选项。

我认为xml2js是一个非常好的XML解析器,它做了很多!

我用Xml进行了测试,看起来像这样:

<QCapsule id="1" name="ALARMS">
    <AlarmLog itemCount="2">
        <AlarmLogItem listIndex="0">
            <EntryType>1</EntryType>
            <AlarmCode>180</AlarmCode>
        </AlarmLogItem>
        <AlarmLogItem listIndex="1">
            <EntryType>1</EntryType>
            <AlarmCode>101</AlarmCode>
        </AlarmLogItem>
    </AlarmLog>
</QCapsule>

打印所有报警功能也很有用:

var printAllAlarms = function(alarmLogItems) {

    console.log(`PrintAllAlarms: Total alarm(s): ${alarmLogItems.length}`);
    alarmLogItems.forEach((alarmLog) => { ;
        console.log(`AlarmLogItem: EntryType: ${alarmLog.EntryType} AlarmCode: ${alarmLog.AlarmCode}`);
    });
}

printAllAlarms(result.QCapsule.AlarmLog.AlarmLogItem);