Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] xml Daten einer URL weiterverarbeiten

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] xml Daten einer URL weiterverarbeiten

    This topic has been deleted. Only users with topic management privileges can see it.
    • Bluefox
      Bluefox last edited by

      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);
        }
      });
      
      1 Reply Last reply Reply Quote 0
      • htrecksler
        htrecksler Forum Testing last edited by

        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> 
        
        1 Reply Last reply Reply Quote 0
        • Y
          ykuendig last edited by

          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)

          1 Reply Last reply Reply Quote 0
          • Bluefox
            Bluefox last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • htrecksler
              htrecksler Forum Testing last edited by

              Wird heute Abend direkt ausprobiert.

              😄 😄 Die xx habe ich natürlich ersetzt.

              1 Reply Last reply Reply Quote 0
              • htrecksler
                htrecksler Forum Testing last edited by

                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> 
                
                1 Reply Last reply Reply Quote 0
                • Bluefox
                  Bluefox last edited by

                  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);
                  	}
                  });
                  
                  1 Reply Last reply Reply Quote 0
                  • Y
                    ykuendig last edited by

                    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?

                    1 Reply Last reply Reply Quote 0
                    • Bluefox
                      Bluefox last edited by

                      @ykuendig:

                      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
                      
                      
                      1 Reply Last reply Reply Quote 1
                      • htrecksler
                        htrecksler Forum Testing last edited by

                        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?

                        1 Reply Last reply Reply Quote 1
                        • Bluefox
                          Bluefox last edited by

                          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.

                          1 Reply Last reply Reply Quote 0
                          • htrecksler
                            htrecksler Forum Testing last edited by

                            Perfekt, funktioniert. Danke Euch allen.

                            1 Reply Last reply Reply Quote 0
                            • M
                              mameier1234 last edited by

                              Ich muss hier leider nochmal nachfragen…

                              ich kann meinen Heizölstand elektronisch abfragen.. unter http://192.168.xx.xx/xml bekomme ich vollgendes Ergebniss

                              This XML file does not appear to have any style information associated with it. The document tree is shown below.
                               <seqsmartbox xmlns="http://tecson.dev.oilview.de/gateway/xsd" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xsi:schemalocation="http://tecson.dev.oilview.de/gateway/xsd/smartbox.xsd"><seqheader><indication>Manuelle Abfrage</indication>
                              <authcode>03B41236A899</authcode>
                               <devoperator><devlocation><devid>2-852</devid>
                              <devversion>V6.02</devversion></devlocation></devoperator></seqheader> 
                               <seqdata><seqtanks><tanknumber>1</tanknumber>
                              <tankname>Heizöl</tankname>
                               <seqtanklevel><tanklevel>490</tanklevel>
                              <tankunit>L</tankunit></seqtanklevel> 
                              <tankpercent>5</tankpercent>
                               <seqtanksize><tanksize>10000</tanksize>
                              <tankunit>L</tankunit></seqtanksize> 
                               <seqtankclear><tankclearance>9010</tankclearance>
                              <tankunit>L</tankunit></seqtankclear></seqtanks></seqdata> 
                               <seqpara><para1>30</para1>
                              <para2>15</para2>
                              <para4>0</para4>
                              <para5>5</para5>
                              <para9>0</para9></seqpara></seqsmartbox> 
                              

                              Was mich nun interessiert ist der wert von <tanklevel>490</tanklevel> …. also nur 490 in einem Objekt...

                              Ganz ehrlich... ich bekomms nicht hin.

                              Hat mir da noch jemand eine Idee ?

                              das mit dem xml2js habe ich schon probiert... Allerdings kann man unter Admin3 wohl keine Module mehr eintragen.. Der Save Button wird nicht aktiv... Zur Zeit ist es bei mir noch so, dass wenn ich über iobroker.pro gehe und damit die Admin Seite aufrufe noch eine 2.x Version kommt. Hier kann ich die xml2js eintragen (und die ist nachher auch in der 3.0 eingetragen..)

                              Ich bekomme nur einen "Error: Parse Error" , wenn ich das hier ausführe:

                              var parseString = require('xml2js').parseString;
                              var request = require('request');
                              
                              request('http://192.168.160.80/xml', 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.tankLevel));
                                          }
                                       });
                                 } else  {
                                   log(error);
                                 }
                              });
                              

                              Irgendwelche Vorschläge ?

                              1 Reply Last reply Reply Quote 0
                              • ruhr70
                                ruhr70 last edited by

                                @mameier1234:

                                Allerdings kann man unter Admin3 wohl keine Module mehr eintragen.. Der Save Button wird nicht aktiv… Zur Zeit ist es bei mir noch so, dass wenn ich über iobroker.pro gehe und damit die Admin Seite aufrufe noch eine 2.x Version kommt. Hier kann ich die xml2js eintragen (und die ist nachher auch in der 3.0 eingetragen..) `

                                Da bin ich auch drüber gestolpert. 🙂

                                Du musst , wenn Du im Javascript-Adapter den Modulnamen eingegeben hast, [ENTER] drücken.

                                Ich bin anfangs immer mit [TAB] weiter und dann wird der Speicherbutton nicht aktiv.

                                Benötigst Du nur diesen einen Wert? <tanklevel>490</tanklevel>

                                Das ist dann wahrscheinlich am Einfachsten, wenn Du einfach den Parser oder Systeminfo-Adapter nimmst oder im Skript

                                Ein Beispiel für ein Regex für den Wert: https://regex101.com/r/uoymuu/1

                                1 Reply Last reply Reply Quote 0
                                • M
                                  mameier1234 last edited by

                                  Morgen…

                                  Danke für den Tipp...

                                  Das mit dem Sysinfo-Adapter hatte ich versucht... es scheiterte aber an der richtigen Regex...

                                  Nun kommt mit dem Parsermodul: arser.0 2018-02-22 07:06:51.277 error Cannot read link "http://192.168.160.80/xml": Error: Parse Error

                                  parser.0 2018-02-22 07:06:41.244 error Cannot read link "http://192.168.160.80/xml": Error: Parse Error

                                  Sysinfo: ähnliche Fehlermeldung...
                                  4885_parser.png

                                  1 Reply Last reply Reply Quote 0
                                  • ruhr70
                                    ruhr70 last edited by

                                    Du bekommst beim Skript, Parser Adapter und Systeminfo Adapter jeweils einen parse Error.

                                    Was bekommst Du denn im Log als Ausgabe, wenn Du bei Deinem Skript den Teil mit parseString weglässt.

                                          parseString(body, {
                                                explicitArray: false,
                                                mergeAttrs: true
                                             }, 
                                             function (err, result) {
                                                if (err) {
                                                   log("Fehler: " + err);
                                                } else {
                                                   log("Result: " + JSON.stringify(result.tankLevel));
                                                }
                                             });
                                    
                                    

                                    Wird mit der Zeile log("Body: " + body); denn der Inhalt der XML im Log ausgegeben?

                                    mac89muc 1 Reply Last reply Reply Quote 0
                                    • M
                                      mameier1234 last edited by

                                      Aeeh…. Ne!

                                      1 Reply Last reply Reply Quote 0
                                      • mac89muc
                                        mac89muc @ruhr70 last edited by

                                        @ruhr70

                                        Hallo zusammen,

                                        ich habe eine ähnliches Problem beim auslesen meines Akkustandes vom Sonos Move, habe allerdings einen neuen Thread dazu aufgemacht nachdem der Hinweis mit dem hohen Alter dieses Threads beim erstellen meiner Antwort aufkam.

                                        Keine Ahnung wie sich das mit Doppelpostings verhält, daher möchte ich ungern hier nochmal alles komplett posten.
                                        Falls sich jemand findet, der hier schon mal helfen konnte und bereit ist sich mein Problem unter folgendem Link hier im Forum anzusehen wäre ich dankbar.

                                        [https://forum.iobroker.net/topic/44272/xml-return-in-blockly-weiter-verarbeiten](Neuer Forumsbeitrag - XML return in Blockly weiterverarbeiten)

                                        Vielen Dank im Voraus - Gruß

                                        1 Reply Last reply Reply Quote 0
                                        • First post
                                          Last post

                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        488
                                        Online

                                        31.7k
                                        Users

                                        79.7k
                                        Topics

                                        1.3m
                                        Posts

                                        6
                                        27
                                        8984
                                        Loading More Posts
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        Community
                                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                        The ioBroker Community 2014-2023
                                        logo