【问题标题】:Iterate through Xml Nodes in node js遍历节点 js 中的 Xml 节点
【发布时间】:2017-07-26 15:38:52
【问题描述】:

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

我想解析这个 xml 结构以从 xml 的每个 wireless-client 节点内的每个 client-macclient-manuflast_signal_dbm 获取值。文档中还有很多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-network 的第一个 wireless-client 节点的值。我想要来自所有具有相同名称的节点的值。我该怎么办?我已经尝试过其他 xml 解析器,但它们似乎都不适合我。

【问题讨论】:

  • 顺便说一句——您的 XML 文件说它是使用 ISO-8859-1 字符编码编写的,但您正在使用 ASCII 字符编码读取它。
  • 会不会导致解析出现问题?
  • 这可能是因为元素和属性names 中的字符不必来自C0 Controls and Basic Latin 块。它还可能损坏文本和 cmets。我并不是说这是你当前的问题,只是它打破了字符编码的基本规则:用用于写作的编码来阅读。
  • 好的!所以我应该把它改成iso。对吗?
  • 看来nodejs本质上不支持ISO-8859-1。 read-xml 可能会有所帮助。也许您可以将它与 camaro 一起使用。

标签: javascript node.js xml parsing


【解决方案1】:

试试下面的 sn-p。欲了解更多信息,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"
    }
  ]
}

【讨论】:

  • 这是当只有当wireless-network xml 中的节点时。如果有多个 wireless-network 节点,就像我在上面链接的 xml 文档中一样。
  • 我刚刚知道您是开发该软件包的人。做得好 :)。继续加油!
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2011-08-19
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多