2017-07-26 142 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

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