2017-07-26 3 views
0

Ich habe ein riesiges XML-Dokument und ich möchte nur bestimmte Daten daraus extrahieren. Der Link zum Dokument ist: https://pastebin.com/mNXWt7dzIterate durch Xml-Knoten in Knoten js

Ich möchte diese XML-Struktur analysieren, Werte erhalten von jedem client-mac, client-manuf und last_signal_dbm in jedem wireless-client Knoten des XML. Es gibt auch viele wireless-network Knoten im Dokument. ich folgenden js Code verwenden:

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()); 

mit diesem Code kann ich nur Wert aus dem ersten wireless-client Knoten der ersten wireless-network analysiert. Ich möchte Werte von allen Knoten mit gleichen Namen. Was soll ich machen? Ich habe bereits andere xml Parser versucht, aber keiner von ihnen scheint für mich zu arbeiten.

+0

BTW-XML-Datei, sagt sie mit der ISO-8859-1-Zeichencodierung geschrieben wurde, aber Sie es mit der ASCII-Zeichencodierung lesen. –

+0

Wird das beim Parsen Probleme verursachen? –

+0

Es könnte sein, weil Zeichen in Element und Attribut [Namen] (https://www.w3.org/TR/REC-xml/#NT-NameStartChar) nicht aus den [C0 Controls und Basic Latin] (http : //www.unicode.org/charts/nameslist/index.html) blockieren. Es könnte auch Text und Kommentare verfälschen. Ich sage nicht, dass es dein aktuelles Problem ist, sondern dass es die Grundregel der Zeichencodierung durchbricht: Lesen mit dem zum Schreiben verwendeten. –

Antwort

2

Versuchen Sie das folgende Snippet. Für weitere Informationen, check the docs

die Vorlage ist xpath like. Zum Beispiel wird das folgende Template übersetzt in: Finde alle Knoten im Pfad //wireless-network/wireless-client; extrahieren Sie für jeden Knoten client-mac und setzen Sie ihn auf mac Feld des Objekts, client-manuf und setzen Sie auf manuf Feld und so weiter.

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)) 

Ausgang

{ 
    "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

Dies ist, wenn es nur gibt, wenn "Wireless-Netzwerk" Knoten in der XML. Was ist, wenn es mehrere "Wireless-Network" -Knoten gibt, genau wie in dem XML-Dokument, das ich oben verlinkt habe? –

+1

@AbhayManiyar sollte es funktionieren. –

+0

Ja, es hat funktioniert! Danke :) –