迭代节点js中的Xml节点

时间:2017-07-26 15:38:52

标签: javascript node.js xml parsing

我有一个巨大的xml文档,我想从中提取某些数据。该文件的链接是: https://pastebin.com/mNXWt7dz

我想解析这个xml结构,以从xml的每个client-mac节点内的每个client-manuflast_signal_dbmwireless-client获取值。文档中还有许多wireless-network个节点。 我正在使用以下js代码:

var libxmljs = require("libxmljs");
var fs = require("fs");
var xmlPath =  "./Kismet.netxml";
var fileData = fs.readFileSync(xmlPath, 'ascii');
var xmlDoc = libxmljs.parseXml(fileData);
var children = xmlDoc.root();
console.log(children.get("//wireless-network//wireless-client//client-mac").text());

使用此代码我只能解析第一个wireless-client的第一个wireless-network节点的值。我想要来自所有具有相同名称的节点的值。我该怎么办?我已经尝试过其他xml解析器,但它们似乎都不适用于我。

1 个答案:

答案 0 :(得分:2)

尝试下面的代码段。有关详细信息,请check the docs

模板是xpath之类的。例如,以下模板转换为:查找路径//wireless-network/wireless-client处的所有节点;对于每个节点,提取client-mac并放入对象的mac字段,client-manuf并放入manuf字段,依此类推。

const transform = require('camaro')

const xml = `
xml goes here
`
const template = {
    wirelessClients: ['//wireless-network/wireless-client', {
        mac: 'client-mac',
        manuf: 'client-manuf',
        lastSignalDbm: 'snr-info/last_signal_dbm'
    }]
}

const result = transform(xml, template)
console.log(JSON.stringify(result, null, 2))

输出

{
  "wirelessClients": [
    {
      "lastSignalDbm": "-30",
      "mac": "00:08:22:26:E8:FB",
      "manuf": "Unknown"
    },
    {
      "lastSignalDbm": "-96",
      "mac": "00:62:EC:4A:68:9A",
      "manuf": "Unknown"
    },
    {
      "lastSignalDbm": "-88",
      "mac": "00:A6:CA:F6:4D:3F",
      "manuf": "Unknown"
    },
    {
      "lastSignalDbm": "-90",
      "mac": "00:A6:CA:F6:61:7F",
      "manuf": "Unknown"
    },
    {
      "lastSignalDbm": "-88",
      "mac": "00:D7:8F:FE:EF:20",
      "manuf": "Unknown"
    }
  ]
}