2017-07-26 143 views
0

我有一个巨大的XML文档,我只想从中提取某些数据。到文档的链接是: https://pastebin.com/mNXWt7dz迭代节点js中的Xml节点

我要分析此XML结构从每个client-macclient-manuflast_signal_dbm获得XML的每个wireless-client节点内的值。文档中还有许多节点。 我使用以下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解析器,但他们都没有为我工作。

+0

BTW-XML文件说,这是写与ISO-8859-1字符编码,但您使用的ASCII字符编码阅读它。 –

+0

这会导致解析中的任何问题吗? –

+0

这可能是因为元素和属性[名称](https://www.w3.org/TR/REC-xml/#NT-NameStartChar)中的字符不必是来自[C0控件和基本拉丁语](http ://www.unicode.org/charts/nameslist/index.html)块。它也可能会破坏文本和评论。我不是说这是你目前的问题,只是它打破了字符编码的基本规则:用写作的方式阅读。 –

回答

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" 
    } 
    ] 
} 
+0

这是当xml中只有'wireless-network'节点的时候。如果有多个'wireless-network'节点,就像在上面链接的xml文档中一样。 –

+1

@AbhayManiyar它应该工作。 –

+0

是的,它的工作!谢谢:) –