XML Shoutcast

lockcat

Erfahrenes Mitglied
Hallo liebe Freunde der Community,

ich habe mal wieder ein Problem :) in Bezug auf PHP, ich arbeite grad daran eine XML Ausgabe hinzubekommen, "SHOUTcast Transcoder" leider verstehe ich es mal wieder nur zum Teil.

Ich nutze die API von Shoutcast möchte gerne alle DJ's ausgeben lassen leider kommt nur eine Weiße Seite...

Die XML sollte folgendes zurück werfen:
http://wiki.winamp.com/wiki/SHOUTcast_Transcoder_AJAX_api_Specification#ListDJS
Code:
 <djlist>
   <dj>
        <name/>
       <password/>
       <priority/>
         <enabled/>
         <banned>
           <year/>
           <month/>
          <day/>
          <hour/>
          <minute/>
          <second/>
        </banned>
      </dj>
      <dj> ... </dj>
      <dj .... </dj>
     
   </djlist>

PHP Code:
PHP:
<?php
error_reporting(E_ALL);
function sct_get_djlist()
{
    $sc_host = 'XXXX';
 
    $sc_port = '0000';
 
    $sc_user = 'admin';
 
    $sc_pass = 'XXXX';
 
    mt_srand((double)microtime()*1000000);
    $seq = mtrand(1,100);
    $post = 'op=listdjs&seq=' . $seq;
 
    $ch = curl_init($sc_host . '/api');
    curl_setopt($ch, CURLOPT_PORT, $sc_port);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_USERPWD, $sc_user . ':' . $sc_pass);
    $curl = curl_exec($ch);
    $xml = new SimpleXMLElement($curl);
    curl_close($ch);
 
    if ($xml->djlist)
    {
        return (string)$xml->djlist->dj->name;
    }
    else
    {
        return 'Fehler';
    
}
?>

Ich hoffe jemand kann mir ein Ansatz geben wie ich zur Lösung kommen

Gruß Lauren
 
Zuletzt bearbeitet:
Wenn du nur eine weiße Seite bekommst, ist evtl. die Fehleranzeige abgeschaltet. Da wo du das error_reporting() stehen hast, füge noch
PHP:
ini_set('display_errors', 1);

ein. Evtl. siehst du dann den Fehler. Ggf. kannst du auch noch beim return des Namen noch ein var_dump() auf $xml einbauen, nur um sicher zu stellen, dass da auch ein SimpleXML-Objekt drin ist. Das Spiel kannst du auch auf die Unterelemente von $xml anwenden.
 
Hi danke für deine Antwort. Haben mir etwas geholfen, ich sehe dass der dump gefühlt ist aber leider bekomm ich es nicht ausgelesen... bin ich wohl zu blod zu... oder meine PHP erfahrung sind nicht so gut.

Gruß Lauren
 
Hmm, was meinst du mit "gefühlt ist"?

Ich würde mich davon vergewissern wollen, was in $xml drin steht:

PHP:
    if ($xml->djlist)
    {
        var_dump($xml); // zum debuggen
        // var_dump($xml->djlist); // noch mehr debugging
        // var_dump($xml->djlist->dj); // und noch mehr debugging
        return (string)$xml->djlist->dj->name;
    }
    else
    {
        return 'Fehler';
    }

Entferne mal Schritt für Schritt die Kommentar-Zeichen vor den var_dump()-Anweisungen und schau, was im Browser passiert. Ggf. hier mal die Ausgaben posten.
 
Hey :)

also mach ich ein
PHP:
var_dump($xml);
ertönt die Ausgabe
Code:
object(SimpleXMLElement)#1 (2) { ["@attributes"]=> array(1) { ["seq"]=> string(2) "42" } ["data"]=> object(SimpleXMLElement)#2 (1) { ["djlist"]=> object(SimpleXMLElement)#3 (1) { ["dj"]=> array(36) { [0]=> object(SimpleXMLElement)#4 (4) { ["name"]=> string(7) "Demo" ["password"]=> string(8) "Demopasswort" ["priority"]=> string(1) "5" ["enabled"]=> string(1) "1" } [1]=> object(SimpleXMLElement)#5 (4) { ["name"]=> string(11) "Demo2" ["password"]=> string(8) "Demopasswort2" ["priority"]=> string(1) "5" ["enabled"]=> string(1) "0" }
usw.

mach ich jedoch eine
PHP:
var_dump($xml->djlist->name);
ausgabe so ertönt nur der Fehler "NULL"

ich hab das Gefühl dass ich die XML falsch auslese oder?

Gruß
 
Da haben wir ihn ja, den Fehler. Das Unterobjekt dj ist ein Array. Darin enthalten sind 0, ein oder mehrere DJ-Objekte. Wenn du willst, kannst du über das Teil iterieren, oder dir einfach das 0 (erste) Element ausgeben:

PHP:
var_dump($xml->djlist->dj[0]->name);
// oder
foreach($xml->djlist->dj as $dj) {
  // var_dump($dj); // debugging
  echo $dj->name . "<br/>";
}

Da hast du allerdings dann ein Problem, dein Rückgabewert von sct_get_djlist() ist string, also kannst du entweder nur einen DJ-Namen oder mehrere aneinander gekettet zurück geben.

EDIT: Übrigens ist var_dump() ein bereits Präformatierter Content, den man besser in die Tags <pre> & </pre> setzt. Damit hat man einen besseren Überblick über die Struktur des Objektes.
 
Also ich glaub ich schreib den code nochmal neu.... also wenn ich es nach deinem bsp. mache erhalte ich auch weitere fehler:

Code:
Notice: Trying to get property of non-object in C:\xampp2\htdocs\trans\index2.php on line 33
NULL 
Warning: Invalid argument supplied for foreach() in C:\xampp2\htdocs\trans\index2.php on line 35

wäre in dem Fall:

PHP:
var_dump($xml->djlist->dj[0]->name);
// oder
foreach($xml->djlist->dj as $dj) {
  var_dump($dj); // debugging
  echo $dj->name . "<br/>";
}
 
Ich hab jetzt mal den Output deines var_dump formatiert:

Code:
object(SimpleXMLElement)#1 (2) { 
  ["@attributes"]=> array(1) { 
    ["seq"]=> string(2) "42" 
  }
  ["data"]=> object(SimpleXMLElement)#2 (1) {
    ["djlist"]=> object(SimpleXMLElement)#3 (1) {
      ["dj"]=> array(36) {
        [0]=> object(SimpleXMLElement)#4 (4) {
          ["name"]=> string(7) "Demo"
          ["password"]=> string(8) "Demopasswort"
          ["priority"]=> string(1) "5"
          ["enabled"]=> string(1) "1"
        }
        [1]=> object(SimpleXMLElement)#5 (4) {
          ["name"]=> string(11) "Demo2"
          ["password"]=> string(8) "Demopasswort2"
          ["priority"]=> string(1) "5"
          ["enabled"]=> string(1) "0"
        }

Dabei habe ich festgestellt, dass du nicht alles hier gepostet hast, denn eigentlich sollten alle geschweiften Klammern wieder zu gehen.

Außerdem ist noch zu sehen, dass dein $xml aus 2 Unterelementen besteht, @attributes und data. Du solltest also mit

PHP:
var_dump($xml->data);

das XML-Element djlist sehen. Der korrekte Pfad zu den Informationen wäre also

$xml->data->djlist->dj

Damit solltest du alle DJs sehen können, wenn du

PHP:
var_dump($xml->data->djlist->dj);

codierst. Und damit ergibt sich auch der foreach:

PHP:
foreach($xml->data->djlist->dj as $dj) {
  // var_dump($dj); // debugging
  echo $dj->name . "<br/>";
}

Im Übrigen und so ganz nebenbei habe ich gerade eine coole Klasse für die Darstellung von Objekt-Bäumen gefunden:

http://raveren.github.io/kint/
 
Zurück