PHP und XML

exportforce

Avachangererfinder
ID: 68278
L
23 April 2006
256
22
Wie kann ich am besten zur Ausgabe das hier auslesen?

<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<MAXLISTENERS>32</MAXLISTENERS>
<SERVERURL>https://www.blut-patches.de/</SERVERURL>
<SERVERTITLE>Blut-Patches.de Radio: Let's Rock</SERVERTITLE>
<SONGTITLE>Scorpions - White Dove</SONGTITLE>
<STREAMSTATUS>1</STREAMSTATUS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>

thx schon mal :)
 
Johnson schrieb:
Ansonsten gibts da auch einige nette Libs für (musst mal happymaster fragen, ich glaub der hat sich vor kurzem mit den Dingern auseinandergesetzt).
(afair war's) theHacker hatte damals SimpleXML vorgeschlagen. Voraussetzung: PHP5.

Wenn die bei dir auch nicht gegeben ist, kannst ja auch mal DOM XML probieren. Ansonsten fehlt mir auch wieder der Überblick - sprich: ich hab mittlerweile wieder vergessen was ging, was nicht und worin es sich großartig unterschied.

Werde eben google und hoffentlich den Cache befragen! ;)
Edit: gebookmarkt; damals: https://www.klamm.de/forum/showthread.php?t=199681
Edit: google-Cache: https://66.249.93.104/search?q=cache:-plqpCG8PaUJ:www.klamm.de/forum/showthread.php?p=3179700
 
@happymaster:
Ich hab die Dirty-Variante vorgeschlagen:

PHP:
$current_listeners=preg_replace('/<SHOUTCASTSERVER>.*<CURRENTLISTENERS>(.*)<\/CURRENTLISTENERS>.*<\/SHOUTCASTSERVER>/i',"$1",$data);
// ...
 
theHacker schrieb:
@happymaster:
Ich hab die Dirty-Variante vorgeschlagen:

PHP:
$current_listeners=preg_replace('/<SHOUTCASTSERVER>.*<CURRENTLISTENERS>(.*)<\/CURRENTLISTENERS>.*<\/SHOUTCASTSERVER>/i',"$1",$data);
// ...
thx
test ich nachher mal :)
 
happymaster schrieb:
Ne, ned dir, sondern in dem Thread hab ich die Dirty-Variante empfohlen.

Wenn die Form sich nicht verändert und nicht mehrere Tags des selben Namens vorkommen, funktioniert es. So pars ich meine Seti@home-Stats (bin nur seit 2 Jahren nimmer aktiv :ugly:)
 
Määäh.. was zur Hölle machst du??

theHacker schrieb:
PHP:
$current_listeners=preg_replace('/<SHOUTCASTSERVER>.*<CURRENTLISTENERS>(.*)<\/CURRENTLISTENERS>.*<\/SHOUTCASTSERVER>/i',"$1",$data);
// ...
Hab's mir eben angeschaut. So filterst du ja nur die current_listeners (okay deine Variable vorne heißt auch nur so) heraus..... ääähm.. wenn er(/sie) mehr/alle Daten auslesen will, dann würde sich imho nicht jedes mal ein hässlicher/unnützer ~_replace, sondern ein ~_match(_all) doch lohnen.
:ugly: :ugly:
 
happymaster schrieb:
So filterst du ja nur die current_listeners (okay deine Variable vorne heißt auch nur so) heraus
Richtig. Drum auch // ...
Für jede Variable is ein Aufruf geplant.
happymaster schrieb:
wenn er(/sie) mehr/alle Daten auslesen will, dann würde sich imho nicht jedes mal ein hässlicher/unnützer ~_replace, sondern ein ~_match(_all) doch lohnen.
Keine Ahnung. Ich hab ja gesagt, das is ne dirty Lösung ;)

Wenn sich alle Nodes auf derselben Ebene und demselben Parent-Node befinden, müsste preg_match_all() alle Daten auf einmal liefern. Try.

Ich hab das damals benutzt, um verschiedene Äste des XML-Baums auszulesen.
 
theHacker schrieb:
Richtig. Drum auch // ...
Für jede Variable is ein Aufruf geplant.Keine Ahnung. Ich hab ja gesagt, das is ne dirty Lösung ;)

Wenn sich alle Nodes auf derselben Ebene und demselben Parent-Node befinden, müsste preg_match_all() alle Daten auf einmal liefern. Try.

Ich hab das damals benutzt, um verschiedene Äste des XML-Baums auszulesen.

Mäh Häckerli.. ich bastel eben noch was. :-? :mrgreen:
 
das nennst du dreckig? also das lässt sich noch überbieten:
PHP:
$xml=fopen("https://.../...xml","r");
fgets($xml);
echo "<pre>
        Listeners: ".substr(fgets($xml),18,-20)."
        Peak: ".substr(fgets($xml),15,-17)."
        Max: ".substr(fgets($xml),14,-16)."
        URL: ".substr(fgets($xml),11,-13)."</pre>";
So, ihr entschuldigt mich, ich muss schon mal losrennen ;)

edit: ach ja, nicht zur Nachahmung empfohlen, mir war nur grad langweilig ;)
 
Grinch schrieb:
das nennst du dreckig? also das lässt sich noch überbieten:
PHP:
$xml=fopen("https://.../...xml","r");
fgets($xml);
echo "<pre>
        Listeners: ".substr(fgets($xml),18,-20)."
        Peak: ".substr(fgets($xml),15,-17)."
        Max: ".substr(fgets($xml),14,-16)."
        URL: ".substr(fgets($xml),11,-13)."</pre>";
So, ihr entschuldigt mich, ich muss schon mal losrennen ;)

edit: ach ja, nicht zur Nachahmung empfohlen, mir war nur grad langweilig ;)

:mrgreen:



Hier:
PHP:
<?
header("Content-type:  text/plain");

$str = "<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<MAXLISTENERS>32</MAXLISTENERS>
<SERVERURL>https://www.blut-patches.de/</SERVERURL>
<SERVERTITLE>Blut-Patches.de Radio: Let's Rock</SERVERTITLE>
<SONGTITLE>Scorpions - White Dove</SONGTITLE>
<STREAMSTATUS>1</STREAMSTATUS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>
<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<MAXLISTENERS>32</MAXLISTENERS>
<SERVERURL>https://www.blut-patches.de/</SERVERURL>
<SERVERTITLE>Blut-Patches.de Radio: Let's Rock</SERVERTITLE>
<SONGTITLE>Scorpions - White Dove</SONGTITLE>
<STREAMSTATUS>1</STREAMSTATUS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>";

preg_match_all("#<SHOUTCASTSERVER>\s*<CURRENTLISTENERS>(\d+)</CURRENTLISTENERS>\s*<PEAKLISTENERS>(\d+)</PEAKLISTENERS>\s*<MAXLISTENERS>(\d+)</MAXLISTENERS>\s*<SERVERURL>([^<]+)</SERVERURL>\s*<SERVERTITLE>([^<]+)</SERVERTITLE>\s*<SONGTITLE>([^<]+)</SONGTITLE>\s*<STREAMSTATUS>(\d+)</STREAMSTATUS>\s*<BITRATE>(\d+)</BITRATE>\s*</SHOUTCASTSERVER>\s*#isU", $str, $t, PREG_SET_ORDER);

print_r($t);

?>

Geht jetzt für mehrere Tags <SHOUTCASTSERVER>. Zur Not anpassen und/oder das _all wieder herausnehmen, wenn das gewünschte Ziel nicht das sein sollte.
 
Grinch schrieb:
das nennst du dreckig? also das lässt sich noch überbieten:
Zwar noch dreckiger, aber es funktioniert nicht so wie meine Lösung.
Bei mir können Nodes auf derselben Ebene noch umgestellt werden:
<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<!-- .... -->
</SHOUTCASTSERVER>
<SHOUTCASTSERVER>
<!-- .... -->
<PEAKLISTENERS>3</PEAKLISTENERS>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>

edit:
@happymaster:
Umstellen wird bei dir auch nicht funkionieren ;)
 
theHacker schrieb:
edit:
@happymaster:
Umstellen wird bei dir auch nicht funkionieren ;)
Pfü.. deins is fufu-Kram.. das ist hässlich und bestimmt unperformant... dann soll er/sie/es halt es nicht drehen. Wie gesagt gleiche Struktur und da meine ich root, children of the root und die children der children of the root (their parents) und so weiter... :ugly: :LOL: Wayne... dann kannsch auch gleich wieder weggehen von regExps und zu den XML-Klassen wieder hin.. gibt bestimmt auch paar andere im Web (wie Sand am Meer nehme ich an), die man verwenden kann! :p

*closed* :mrgreen: by theHacker :p
 
Nee alles brauch ich nicht, will ja jeden Tag einzeln nutzen können ^^
Daher ist die "Dirty" noch die Beste Methode bis jetzt ^^
 
Mal als Anregung:
PHP:
<?php

  $str = <<<XML
<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<MAXLISTENERS>32</MAXLISTENERS>
<SERVERURL>https://www.blut-patches.de/</SERVERURL>
<SERVERTITLE>Blut-Patches.de Radio: Let's Rock</SERVERTITLE>
<SONGTITLE>Scorpions - White Dove</SONGTITLE>
<STREAMSTATUS>1</STREAMSTATUS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>
XML;

  $p = xml_parser_create();
  xml_parse_into_struct($p, $str, $vals, $index);
  xml_parser_free($p);

  echo $vals[ $index['PEAKLISTENERS'][0] ]['value'];
?>
Einfach, flexibel und nur wenig Aufwand, um den Zusammenhang zwischen $index und $vals zu schnallen.
 
exportforce schrieb:
Nee alles brauch ich nicht, will ja jeden Tag einzeln nutzen können ^^
Daher ist die "Dirty" noch die Beste Methode bis jetzt ^^
?

Also von der Struktur her taugt meines imho am besten! :)
(Als regExp-Skript.)
 
tleilax schrieb:
Mal als Anregung:
PHP:
<?php

  $str = <<<XML
<SHOUTCASTSERVER>
<CURRENTLISTENERS>0</CURRENTLISTENERS>
<PEAKLISTENERS>3</PEAKLISTENERS>
<MAXLISTENERS>32</MAXLISTENERS>
<SERVERURL>https://www.blut-patches.de/</SERVERURL>
<SERVERTITLE>Blut-Patches.de Radio: Let's Rock</SERVERTITLE>
<SONGTITLE>Scorpions - White Dove</SONGTITLE>
<STREAMSTATUS>1</STREAMSTATUS>
<BITRATE>40</BITRATE>
</SHOUTCASTSERVER>
XML;

  $p = xml_parser_create();
  xml_parse_into_struct($p, $str, $vals, $index);
  xml_parser_free($p);

  echo $vals[ $index['PEAKLISTENERS'][0] ]['value'];
?>
Einfach, flexibel und nur wenig Aufwand, um den Zusammenhang zwischen $index und $vals zu schnallen.

gehta ber alles nur bei php5

gibbet sowas acuh für version 4?