Avatar billede rmk24 Nybegynder
09. august 2012 - 11:19 Der er 28 kommentarer og
1 løsning

rss feed reader

nu har jeg ledt og læst i lang tid så tænkte jeg ville give det en chance herinde. (har læst en del herinde omkring samme emne)

mangler et script som viser rss feeds fra andre sider på min hjemmeside. feks denne

http://www.mtv.com/rss/news/news_full.jhtml

er helt lost omkring hvordan jeg gør. håber nogen kan hjælpe.
Avatar billede claes57 Ekspert
09. august 2012 - 13:06 #1
du kan se, hvordan fx http://sitemagic.dk/ har løst det. Hent den fulde cms og pak den ud til en mappe. Derunder ligger \data\rsslib med de filer, du skal tjekke - du kan så kode fx

<body>
<?php
    require_once("rsslib.php");
    $url = "http://www.computerworld.dk/rss/all";
    echo "<b>Computerworld</b>";
    echo RSS_Links($url, 9, false, true);

og få de seneste 10 nyheder fra computerworld vist
Avatar billede olebole Juniormester
09. august 2012 - 18:15 #2
<ole>

Mange PHP'ere er ikke vandt til at håndtere XML-data og finder derfor rss vanskeligt at arbejde med. Du kan ganske let konvertere XML'en til associative arrays på følgende måde:

<?php
$sUrl = 'http://www.mtv.com/rss/news/news_full.jhtml';
$sXml = file_get_contents($sUrl);
$oXml = simplexml_load_string($sXml);
$sJson = json_encode($oXml);
$aData = json_decode($sJson, true);

var_dump($aData);
?>

Derefter kan du selv vælge udskriften - i princippet noget i stil med:

$arrItems = $aData['channel']['item'];
foreach ($arrItems as $item) {
    echo '<div>';
    echo '<div>'.$item['category'].'</div>';
    echo '<h4>'.$item['shorthead'].'</h4>';
    echo '<div>'.$item['pubDate'].'</div>';
    echo '<p><a href="'.$item['link'].'" target="_blank">Link</a></p>';
    echo '</div><hr>';
}


/mvh
</bole>
Avatar billede rmk24 Nybegynder
09. august 2012 - 19:49 #3
kigger lige på det senere i aften. takker på forhånd :)
Avatar billede rmk24 Nybegynder
09. august 2012 - 20:15 #4
har prøvet noget lign. men kommer med denne fejl

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in

noget der er slået fra på serveren. er ved gigahost. så pænt træls. der er vidst ikk mange der tillader det har jeg læst
Avatar billede rmk24 Nybegynder
09. august 2012 - 20:38 #5
må lige prøve om jeg kan slå det fra et sted. takker for hjælpen skriver lige senere når jeg har snakket med gigahost omkring php.ini
Avatar billede rmk24 Nybegynder
09. august 2012 - 21:18 #6
har aldrig brugt php.ini hvordan laver jeg sådan en fil? kan jeg bare ligge den i mappen som kører det script? eller skal den ligge i roden.

hvordan ser filen ud hvis det skal allow_url_fopen = On så jeg kan bruge det script? gerne total fil. ikk kun den linie
Avatar billede olebole Juniormester
09. august 2012 - 21:36 #7
php.ini er en konfigurationsfil, som i forvejen ligger et sted i installationen. Det er et enkelt direktiv i den, du skal rette - du skal ikke skrive hele filen.

Et sted i den står der:

;;;;;;;;;;;;;;;;;;
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
; http://php.net/allow-url-fopen
allow_url_fopen = Off

- og der skal du bare rette Off til On. Spørgsmålet er, om du har adgang til php.ini. Jeg tvivler - men spørg udbyderen
Avatar billede olebole Juniormester
09. august 2012 - 21:38 #8
- og nej, jeg paster ikke alle små 2.000 linjer ind her. Du får kun de par linjer  =)
Avatar billede rmk24 Nybegynder
09. august 2012 - 21:42 #9
så får jeg denne fejl på din kode

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 84: parser error : EntityRef: expecting ';' in /home/www/tester.kasperp.info/rss.php on line 4

Warning: simplexml_load_string() [function.simplexml-load-string]: Young Jeezy: From Corporate Thug To Atlantic's Senior VP Of A&R in /home/www/tester.kasperp.info/rss.php on line 4

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/www/tester.kasperp.info/rss.php on line 4
bool(false) Derefter kan du selv v&#65533;lge udskriften - i princippet noget i stil med:
Warning: Invalid argument supplied for foreach() in /home/www/tester.kasperp.info/rss.php on line 14
Avatar billede rmk24 Nybegynder
09. august 2012 - 21:43 #10
fandt ud af det inde på gigahost. behøvede ikk gå ind i php.ini de havde åbenbart en del på deres side hvor man kunne ændre i den uden at åbne den :)
Avatar billede olebole Juniormester
09. august 2012 - 21:48 #11
Cool! Har du fået koden til at fungere?
Avatar billede rmk24 Nybegynder
09. august 2012 - 21:49 #12
nej kommer med den fejl jeg har skrevet før.

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 84: parser error : EntityRef: expecting ';' in /home/www/tester.kasperp.info/rss.php on line 4

Warning: simplexml_load_string() [function.simplexml-load-string]: Young Jeezy: From Corporate Thug To Atlantic's Senior VP Of A&R in /home/www/tester.kasperp.info/rss.php on line 4

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/www/tester.kasperp.info/rss.php on line 4
bool(false) Derefter kan du selv v&#65533;lge udskriften - i princippet noget i stil med:
Warning: Invalid argument supplied for foreach() in /home/www/tester.kasperp.info/rss.php on line 14
Avatar billede rmk24 Nybegynder
09. august 2012 - 21:58 #13
nogen ideer til hvad der gør de fejl kommer. jeg kan slet ikke gennemskue det
Avatar billede olebole Juniormester
09. august 2012 - 22:02 #14
Prøv en rss-URL, som virker  *o)
Avatar billede olebole Juniormester
09. august 2012 - 22:04 #15
MTV nosser tydeligvis rundt i noget i øjeblikket. Prøv den URL, Claes skrev ovenfor:

http://www.computerworld.dk/rss/all
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:06 #16
lige prøvet.. samme fejl

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 139: parser error : EntityRef: expecting ';' in /home/www/tester.kasperp.info/rss.php on line 6

Warning: simplexml_load_string() [function.simplexml-load-string]: Young Jeezy: From Corporate Thug To Atlantic's Senior VP Of A&R in /home/www/tester.kasperp.info/rss.php on line 6

Warning: simplexml_load_string() [function.simplexml-load-string]: ^ in /home/www/tester.kasperp.info/rss.php on line 6
bool(false) Derefter kan du selv v&#65533;lge udskriften - i princippet noget i stil med:
Warning: Invalid argument supplied for foreach() in /home/www/tester.kasperp.info/rss.php on line 16
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:06 #17
sådan her den ser ud nu. måske jeg har lavet en fejl


<?php
$site_url = 'http://www.computerworld.dk/rss/all';
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, $site_url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

ob_start();
curl_exec($ch);
curl_close($ch);
$file_contents = ob_get_contents();
ob_end_clean();

echo $file_contents;
?>
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:08 #18
så virker den. bare en masse data der kommer ud. men skal nok bare kigge mig omkring og sætte det op. takker for hjælpen. smider du et svar. så prøver jeg mig frem herfra
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:11 #19
forkert fil jeg lige satte ind herinde. men prøver mig frem med det sidste så bare smid svar og tak for hjælpen
Avatar billede olebole Juniormester
09. august 2012 - 22:14 #20
Ja, fejlen i #16 stammer fra MTV's side  =)
Avatar billede olebole Juniormester
09. august 2012 - 22:16 #21
Anyway, så samler jeg ikke point - og Claes plejer vist heller ikke at ville modtage. Læg et svar selv og accepter det  =)
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:19 #22
okay det vil jeg så gøre. mangler bare at finde ud af hvordan jeg får mere data end dato og link ud :) og hvorfor den udskriver alt. du må gerne kigge 2 min på det hvis du vil

http://tester.kasperp.info/rss.php
Avatar billede rmk24 Nybegynder
09. august 2012 - 22:32 #23
kigger på det i morgen. mit hoved kører sku rundt nu. tak for hjælpen. lukker den her
Avatar billede olebole Juniormester
09. august 2012 - 22:57 #24
"hvorfor den udskriver alt" >> Det er ikke en fejl. Det er en feature  *D

Det var bare som test, så du kunne se strukturen i dine arrays. Det er dog ikke tydeligt uden et PRE element. Prøv at skrive:

<?php
$sUrl = 'http://www.mtv.com/rss/news/news_full.jhtml';
$sXml = file_get_contents($sUrl);
$oXml = simplexml_load_string($sXml);
$sJson = json_encode($oXml);
$aData = json_decode($sJson, true);

echo '<pre>';
var_dump($aData);
echo '</pre>';
?>

Så bliver det lidt pænere, og du kan lettere se, hvordan du skal 'navigere' rundt i de modtagne data.

Mens du udvikler på koden i den anden boks i #2, kommenterer du de sidste tre linjer ud. Så har du dem hele tiden klar, når/hvis du igen har brug for at se hele strukturen - eller dele af den. Du kan jo f.eks. også skrive:

var_dump($aData['channel']);

- eller:

var_dump($aData['channel']['item']);

- for at få vist disse strukturer. På den måde kan du forholdsvis let finde 'adressen' på andre felter, du måtte ønske at vise  =)
Avatar billede olebole Juniormester
09. august 2012 - 23:40 #25
Hmmm ... nu har jeg lige testet, og der er en bug i simpleXML, som jeg ikke har taget højde for. Derfor bør du skrive linjen om, hvor JSON-strengen skabes. Jeg har prøvet at skrive en version for ComputerWorld's rss - med en anelse rå formatering:

<?php
$sUrl = 'http://www.computerworld.dk/rss/all';
$sXml = file_get_contents($sUrl);
$oXml = simplexml_load_string($sXml);
$sJson = json_encode(new SimpleXMLElement($oXml->asXML(), LIBXML_NOCDATA));
$aData = json_decode($sJson,true);

/*
echo '<pre>';
var_dump($aData['channel']['item']);
echo '</pre>';
echo '<hr>';
*/

$arrItems = $aData['channel']['item'];
$aHTML = array();
foreach ($arrItems as $item) {
    $aHTML[] = '<div>';
    $aHTML[] = '<h4>'.$item['title'].'</h4>';
    $aHTML[] = '<div>'.$item['description'].'</div>';
    $aHTML[] = '<div style="font-size:0.8em">'.$item['author'].': <span style="color:#999">'.$item['pubDate'].'</span></div>';
    $aHTML[] = '<p><a href="'.$item['link'].'" target="_blank">Link</a></p>';
    $aHTML[] = '</div><hr>';
}

echo implode('', $aHTML);
?>

Dette vil dog smide en notice (hvis din PHP er sat fornuftigt op), når/hvis et felt ikke eksisterer. I skrivende studn mangler der et 'author' felt i et item - og det smider en notice  :o|

Løsningen er at sikre sig ved hvert felt med isset:

foreach ($arrItems as $item) {
    $aHTML[] = '<div>';
    if (isset($item['title'])) $aHTML[] = '<h4>'.$item['title'].'</h4>';
    if (isset($item['description'])) $aHTML[] = '<div>'.$item['description'].'</div>';
    if (isset($item['author']) && isset($item['pubDate'])) $aHTML[] = '<div style="font-size:0.8em">'.$item['author'].': <span style="color:#999">'.$item['pubDate'].'</span></div>';
    if (isset($item['link'])) $aHTML[] = '<p><a href="'.$item['link'].'" target="_blank">Link</a></p>';
    $aHTML[] = '</div><hr>';
}
Læg i øvrigt også mærke til, at jeg inde i løkken skriver til en 'array buffer', som udskrives én gang. Der er mere effektivt end at udskrive hver linje i løkken  =)
Avatar billede rmk24 Nybegynder
09. august 2012 - 23:44 #26
takker. tror jeg er meget træt. hvordan får jeg udskrevet feks title..


de andre kan jeg skrive $item['pubDate']. men kan jeg ikk ved feks title. så skriver den array og nu kan ikk lige få drejet den om til hvad der skal stå så.


[0]=>
  array(6) {
    ["title"]=>
    array(0) {
    }
    ["author"]=>
    string(9) "Matt Egan"
    ["link"]=>
    string(128) "http://www.computerworld.dk/art/218885/her-er-windows-8-meget-bedre-end-windows-7?utm_source=RSS&utm_medium=RSS&utm_campaign=RSS"
    ["description"]=>
    array(0) {
    }
    ["pubDate"]=>
    string(31) "Thu, 09 Aug 2012 16:06:00 +0200"
    ["guid"]=>
    string(38) "http://www.computerworld.dk/art/218885"
  }
Avatar billede rmk24 Nybegynder
09. august 2012 - 23:46 #27
okay kigger på den i morgen. mit hovede kan ikk finde rundt i mere i dag tror jeg. takker mange gange for hjælpen :)
Avatar billede rmk24 Nybegynder
09. august 2012 - 23:52 #28
takker for hjælpen. nu virker det :)
Avatar billede olebole Juniormester
09. august 2012 - 23:56 #29
#26/28: Ja, det klarer linjen:

$sJson = json_encode(new SimpleXMLElement($oXml->asXML(), LIBXML_NOCDATA));

Der er som sagt en 'pudsighed' i simpleXML, som gør, at CDATA ikke parses. Det tager denne linje højde for.

Og selvtak  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester