NEWS
[gelöst] xml Daten einer URL weiterverarbeiten
-
Wenn ich eine URL aufrufe (192.168.178.xx:8090/now_playing) (Bose Soundtouch) erhalte ich als Antwort eine XML Datei.
Daten aus dieser Datei würde ich gerne weiterverarbeiten.
Kann mit jemand auf die Sprünge helfen wie ich das mit einem Script anstellen kann?
Die XML sieht wie folgt aus (Beispiel)
- <nowplaying source="INTERNET_RADIO" deviceid="08DF1F46E63F">- <contentitem source="INTERNET_RADIO" ispresetable="true" sourceaccount/location="32759"><itemname>WDR 2 Münsterland</itemname></contentitem> <track> <artist><album><stationname>WDR 2 Münsterland</stationname> <art artimagestatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-32759.jpg</art> <playstatus>PLAY_STATE</playstatus> <description>MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.</description> <stationlocation>Internet Only</stationlocation></album></artist></nowplaying>
-
Ich werf jetzt mal einen Knochen:
var http = require('http'); var xml2js = require('xml2js'); var options = { explicitArray: false, mergeAttrs: true }; var parser = new xml2js.Parser(options); var reqOptions = { hostname: '192.168.178.xx', port: 8090, path: '/now_playing', method: 'GET' }; log('get http://' + reqOptions.hostname + reqOptions.path); var req = http.request(reqOptions, function (res) { var data = ''; res.on('data', function (chunk) { data += chunk; }); res.on('end', function () { log('received data from '+reqOptions.hostname); parser.parseString(data, function (err, result) { if (err) { log("Fehler: "+err); } else { log("Result: "+result.root.itemName); } }); }); }); req.on('error', function (e) { log(e.message); }); req.end();
Es gibt, wie immer, wenig Garantie auf geklaubten Code.
Je nach dem, welche Adapter Du schon verwendest, ist xml2js schon dabei oder auch nicht.
Sicherheitshalber solltest Du bei den Instanzen die Konfiguration vom Javascript Adapter öffenen und bei den zusätzlichen NPM Modulen "xml2js" reinschreiben.
-
Ich kann jetzt schon sagen, dass xml2js nicht dabei ist und man muss in der Adapter-Settings den reinschreiben.
-
Ausser man hat den yr.Adapter ?! Aber vielleicht täusche ich mich… Schreib einfach rein
-
-
Ich schreib dann mal rein
BTW reicht das reinschreiben aus damit das zusätzliche Modul installiert wird?
Oder muss man zusätzlich:
/iobroker…/npm install ... ausführen?
Aber schon mall Danke für den geklauten Code. Heute abend wird getestet.
-
Geklaubt, nicht geklaut! Meint, von verschiedenen offenen Quellen zusammengetragen und verschmolzen. Und bei mir mit einem Sonos Lautsprecher nachgeprüft.
Zu deiner Frage: -> Ein Bild - Und die Antwort: JA reicht aus.
452_iobrokerjs01.png -
Sorry, wer lesen kann…
-
Bin leider erst heute zum testen gekommen. Ich erhalte jetzt folgenden Fehler.
2015-06-14 09:21:10.693 - info: javascript.0 script.js.xxxTESTSCRIPTxxx: received data from 192.168.178.26 2015-06-14 09:21:10.709 - error: uncaught exception: Uncaught, unspecified "error" event. 2015-06-14 09:21:10.709 - error: TypeError: Uncaught, unspecified "error" event. at TypeError (<anonymous>:null:null) at Parser.emit (events.js:74:15) at Parser.exports.Parser.Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:482:16) at Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:6:59) at IncomingMessage. <anonymous>(script.js.xxxTESTSCRIPTxxx:41:16) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:929:16 at process._tickCallback (node.js:419:13)</anonymous></anonymous>
xml2js habe ich in den Javascript-Adapter Settings eingetragen.
-
Probiere so aus:
var xml2js = require('xml2js'); var options = { explicitArray: false, mergeAttrs: true }; var parser = new xml2js.Parser(options); var request = require('request'); request('http://192.168.178.xx:8090/now_playing', function (error, response, body) { if (!error && response.statusCode == 200) { parser.parseString(body, function (err, result) { if (err) { log("Fehler: "+err); } else { log("Result: "+result.root.itemName); } }); } else { log(error); } });
-
Dann kommt dieser Eintrag im log:
undefined2015-06-15 05:46:43.104 - info: javascript.0 Start javascript script.js.xxxTESTSCRIPTxxx 2015-06-15 05:46:43.104 - info: javascript.0 script.js.xxxTESTSCRIPTxxx: sunset: Mon Jun 15 2015 21:52:24 GMT+0200 (Mitteleuropäische Sommerzeit) 2015-06-15 05:46:43.260 - info: javascript.0 script.js.xxxTESTSCRIPTxxx: registered 0 subscriptions and 0 schedules 2015-06-15 05:46:43.322 - error: uncaught exception: Uncaught, unspecified "error" event. 2015-06-15 05:46:43.322 - error: TypeError: Uncaught, unspecified "error" event. at TypeError (<anonymous>:null:null) at Parser.emit (events.js:74:15) at Parser.exports.Parser.Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:482:16) at Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:6:59) at Request._callback (script.js.xxxTESTSCRIPTxxx:23:11) at Request.self.callback (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:354:22) at Request.emit (events.js:98:17) at Request. <anonymous>(C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1207:14) at Request.emit (events.js:117:20) at IncomingMessage. <anonymous>(C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1153:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:929:16 at process._tickCallback (node.js:419:13) 2015-06-15 05:46:43.651 - error: host.IntelNuc instance system.adapter.javascript.0 terminated with code 6 (uncaught exception) 2015-06-15 05:46:43.666 - info: host.IntelNuc Restart adapter system.adapter.javascript.0 because enabled 2015-06-15 05:47:13.680 - info: host.IntelNuc instance system.adapter.javascript.0 started with pid 3952</anonymous></anonymous></anonymous>
-
Ich hab keine Ahnung ob es einen Unterschied macht, dass Du an einem Windows System bist?! Oder was sonst.
Jedenfalls aber:
log("Result: "+result.root.itemName);
Da musst Du anstelle von 'itemName' den Namen eines vorhandenen Tags aus dem xml-Ergebnis einsetzen. Bei meinem Sonos testweise zB:
log("Result: "+result.root.device.manufacturer);
Weiterhin hoffe ich, dass Du hier die xx-en weggemacht hast:
> request('[http://192.168.178.xx:8090/now_playing](http://192.168.178.xx:8090/now_playing)', function (error, response, body)
-
Was bringt bei dir:
var xml2js = require('xml2js'); var options = { explicitArray: false, mergeAttrs: true }; var parser = new xml2js.Parser(options); var request = require('request'); request('http://192.168.178.xx:8090/now_playing', function (error, response, body) { if (!error && response.statusCode == 200) { log("Body: " + body); parser.parseString(body, function (err, result) { if (err) { log("Fehler: "+err); } else { log("Result: "+result.root.itemName); } }); } else { log(error); } });
Abgestützt wird beim Parsen. D.h. Response ist vermutlich kein xml.
-
Wird heute Abend direkt ausprobiert.
Die xx habe ich natürlich ersetzt.
-
Nach der letzten Änderung erschein im log:
2015-06-15 18:21:07.828 - info: javascript.0 script.js.xxxTESTSCRIPTxxx: Body: <nowplaying deviceid="08DF1F46E63F" source="INTERNET_RADIO"><contentitem source="INTERNET_RADIO" location="32759" sourceaccount/ispresetable="true"><itemname>WDR 2 Münsterland</itemname></contentitem><track><artist></artist><album></album><stationname>WDR 2 Münsterland</stationname><art artimagestatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-32759.jpg</art><playstatus>PLAY_STATE</playstatus><description>MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.</description><stationlocation>Internet Only</stationlocation></nowplaying> 2015-06-15 18:21:07.844 - error: uncaught exception: Uncaught, unspecified "error" event. 2015-06-15 18:21:07.859 - error: TypeError: Uncaught, unspecified "error" event. at TypeError (<anonymous>:null:null) at Parser.emit (events.js:74:15) at Parser.exports.Parser.Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:482:16) at Parser.parseString (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\xml2js\lib\xml2js.js:6:59) at Request._callback (script.js.xxxTESTSCRIPTxxx:24:11) at Request.self.callback (C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:354:22) at Request.emit (events.js:98:17) at Request. <anonymous>(C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1207:14) at Request.emit (events.js:117:20) at IncomingMessage. <anonymous>(C:\Program Files\iobroker\node_modules\iobroker.javascript\node_modules\request\request.js:1153:12) at IncomingMessage.emit (events.js:117:20) at _stream_readable.js:929:16 at process._tickCallback (node.js:419:13) 2015-06-15 18:21:08.187 - error: host.IntelNuc instance system.adapter.javascript.0 terminated with code 6 (uncaught exception)</anonymous></anonymous></anonymous>
-
var parseString = require('xml2js').parseString; var request = require('request'); request('http://192.168.178.xx:8090/now_playing', function (error, response, body) { if (!error && response.statusCode == 200) { log("Body: " + body); parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { if (err) { log("Fehler: " + err); } else { log("Result: " + JSON.stringify(result.nowPlaying)); } }); } else { log(error); } });
-
Ich hab kein Bose. Aber der String kopiert und eingefügt hatte bei mir auch Probleme gemacht. Kann es sein, dass das result noch irgend wie gefiltert und / oder utf-8-ed werden muss?
-
Ich hab kein Bose. Aber der String kopiert und eingefügt hatte bei mir auch Probleme gemacht. Kann es sein, dass das result noch irgend wie gefiltert und / oder utf-8-ed werden muss? `
Bei mir funktioniert das:var parseString = require('xml2js').parseString; var request = require('request'); //request('http://192.168.178.xx:8090/now_playing', function (error, response, body) { //if (!error && response.statusCode == 200) { var body = '<nowplaying deviceid="08DF1F46E63F" source="INTERNET_RADIO"><contentitem source="INTERNET_RADIO" location="32759" sourceaccount/ispresetable="true"><itemname>WDR 2 Münsterland</itemname></contentitem><track><artist></artist><album></album><stationname>WDR 2 Münsterland</stationname><art artimagestatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-32759.jpg</art><playstatus>PLAY_STATE</playstatus><description>MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.</description><stationlocation>Internet Only</stationlocation></nowplaying>'; log("Body: " + body); parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { if (err) { log("Fehler: " + err); } else { log("Result: " + JSON.stringify(result.nowPlaying)); } }); //} else { // log(error); //} //});
Output:
javascript-0 2015-06-15 21:45:30 info script.js.Script1: registered 0 subscriptions and 0 schedules javascript-0 2015-06-15 21:45:30 info script.js.Script1: Result: {'deviceID':'08DF1F46E63F','source':'INTERNET_RADIO','ContentItem':{'source':'INTERNET_RADIO','location':'32759','sourceAccount':'','isPresetable':'true','itemName':'WDR 2 Münsterland'},'track':'','artist':'','album':'','stationName':'WDR 2 Münsterland','art':{'_':'http://logo.vtuner.net/007452/logo/logo-32759.jpg','artImageStatus':'IMAGE_PRESENT'},'playStatus':'PLAY_STATE','description':'MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.','stationLocation':'Internet Only'} javascript-0 2015-06-15 21:45:30 info script.js.Script1: Body: WDR 2 MünsterlandWDR 2 Münsterlandhttp://logo.vtuner.net/007452/logo/logo-32759.jpgPLAY_STATEMP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.Internet Only javascript-0 2015-06-15 21:45:30 info Start javascript script.js.Script1
-
yes…
Der code
var parseString = require('xml2js').parseString; var request = require('request'); request('http://192.168.178.26:8090/now_playing', function (error, response, body) { if (!error && response.statusCode == 200) { //var body = '<nowplaying deviceid="08DF1F46E63F" source="INTERNET_RADIO"><contentitem source="INTERNET_RADIO" location="32759" sourceaccount/ispresetable="true"><itemname>WDR 2 Münsterland</itemname></contentitem><track><artist></artist><album></album><stationname>WDR 2 Münsterland</stationname><art artimagestatus="IMAGE_PRESENT">http://logo.vtuner.net/007452/logo/logo-32759.jpg</art><playstatus>PLAY_STATE</playstatus><description>MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.</description><stationlocation>Internet Only</stationlocation></nowplaying>'; log("Body: " + body); parseString(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { if (err) { log("Fehler: " + err); } else { log("Result: " + JSON.stringify(result.nowPlaying)); } }); } else { log(error); } });
funktioniert. Zumindest habe ich jetzt keine Fehler mehr in der log-Datei.
Jetzt brauch ich nur noch ein Beispiel wie ich daraus die einzelnen Werte selektieren kann.
Kann ich dass jetzt wie ein Objekt ansprechen?
-
Als Ergebnis hast du ein Objekt:
{"nowPlaying": { 'deviceID' : '08DF1F46E63F', 'source' : 'INTERNET_RADIO', 'ContentItem' : { 'source' : 'INTERNET_RADIO', 'location' : '32759', 'sourceAccount' : '', 'isPresetable' : 'true', 'itemName' : 'WDR 2 Münsterland' }, 'track' : '', 'artist' : '', 'album' : '', 'stationName' : 'WDR 2 Münsterland', 'art' : { '_' : 'http://logo.vtuner.net/007452/logo/logo-32759.jpg', 'artImageStatus' : 'IMAGE_PRESENT' }, 'playStatus' : 'PLAY_STATE', 'description' : 'MP3 128 kbps Internet Only, Aktuelle Infos, Sport, Service und Unterhaltung prägen WDR 2\. Dazu aktuelle Hits und erwachsene Rock und Popmusik der letzten 30 Jahre.', 'stationLocation' : 'Internet Only' } }
Und ja das ist ein Objekt. Wenn du z.B. artImageStatus extrahieren willst dann solltest du result.nowPlaying.art.artImageStatus aufrufen.