ugrás a tartalomhoz

invalid token

nemalevi · 2009. Szep. 23. (Sze), 21.12
Php-val szeretnék rss-t beolvasni. Ugyanazzal a szkripttel localhoston működik rendesen, de a tárhelyen hibát ír ki: XML error: not well-formed (invalid token) at line 4. A hibát nem jelzi minden rss feed-nél. Gondolom az ékezettel lehet valami, de nem tudom, hogy lehetne megoldani a problémát.
 
1

Hibás XML

Poetro · 2009. Szep. 24. (Cs), 00.05
Az XML amit próbálsz olvasni hibás. Próbáld meg ráküldeni a Feed Validator-ra, és meg fogod tudni, hol, és milyen hibái vannak.
2

zsákutca

nemalevi · 2009. Szep. 24. (Cs), 09.25
Feed validátorral már vizsgáltam, a feed érvényes.
3

no idea?

nemalevi · 2009. Szep. 24. (Cs), 16.53
valakinek ötlet?
4

Kedves weblaborosok

nemalevi · 2009. Szep. 25. (P), 08.53
Biztos van valaki, aki tud választ találni erre a nem túl bonyolult problémára.
5

biztosan

gex · 2009. Szep. 25. (P), 09.43
csak lehet hogy meg kéne mutatni a feedet, a programod ide vágó részét vagy bármit amiből egyáltalán el lehet indulni.

"van egy autóm, nem indul, de nem minden indításnál van gondja, mi lehet a baj?"
6

részletek

Drawain · 2009. Szep. 25. (P), 09.46
Szerinted ennyi információból ki és hogyan segítene? Milyen RSS-t próbálsz olvasni? Próbáltál már a scripteddel működő/jó rss-t olvasni? Pl. weblaboros is megteszi. Arról nem is beszélve, hogyha látnánk a kódot és/vagy az rss-t, már előrébb lennénk...
8

igen

nemalevi · 2009. Szep. 25. (P), 10.37
Amint írtam localhoston azt az rss-t is jól olvassa be, amit a tárhelyen nem. A tárhelyen pedig egyes rss-eket beolvas, míg másokat nem. Többek között, amit én generálok azt sem. A tárhely egyébként külföldi szerveren van és a php verzió is eltér.
Én azt sejtem, hogy az ékezetekkel kéne valamit kezdeni.
9

content-type

Drawain · 2009. Szep. 25. (P), 13.54
A content-type ugye jól van beállítva az rss-re?
  1. header('Content-Type: application/rss+xml');  
12

Content-Type

nemalevi · 2009. Szep. 25. (P), 16.38
Persze a fejlécet is beállítottam.
7

Itt van a szkript, amivel

nemalevi · 2009. Szep. 25. (P), 10.26
Itt van a szkript, amivel generálom az rss-t.
  1. class RSS  
  2.   {  
  3.     public function RSS()  
  4.     {  
  5.         require_once ('mysql_connect.php');  
  6.     }  
  7.   
  8.     public function GetFeed()  
  9.     {  
  10.         return $this->getDetails() . $this->getItems();  
  11.     }  
  12.   
  13.     private function dbConnect()  
  14.     {  
  15.         DEFINE ('LINK', mysql_connect (DB_HOST, DB_USER, DB_PASSWORD));  
  16.     }  
  17.       
  18.   
  19.     private function getDetails()  
  20.     {  
  21.             $details = '<?xml version="1.0" encoding="ISO-8859-1"?>  
  22.                 <rss version="2.0">  
  23.                     <channel>  
  24.                         <title><![CDATA[ Title ]]></title>  
  25.                         <link>http://honlap.hu</link>  
  26.                         <description></description>  
  27.                         <language>hu-HU</language>  
  28.                         <generator></generator>  
  29.                         ';  
  30.       
  31.         return $details;  
  32.     }  
  33.   
  34.     private function getItems()  
  35.     {  
  36.         $itemsTable = "index_oldal";  
  37.         $this->dbConnect($itemsTable);  
  38.         $query = "SELECT * FROM "$itemsTable ." ORDER BY id DESC LIMIT 10";  
  39.         $result = mysql_db_query (DB_NAME, $query, LINK);  
  40.         $items = '';  
  41.         while($row = mysql_fetch_array($result))  
  42.         {  
  43.          $cikk_tomb = explode(" "$row['text']);  
  44.          $elvalasztas = $cikk_tomb[32]." ".$cikk_tomb[33];  
  45.          $elvalasztas_ket_reszre = explode($elvalasztas$row['text']);  
  46.          $szoveg = $elvalasztas_ket_reszre[0].'...';  
  47.             $items .= '<item>  
  48.                 <title>'. $row["cim"] .'</title>  
  49.                 <link>http://www.honlap.hu/index.php?article='. $row['id'] .'</link>  
  50.                 <description><![CDATA[ '.  strip_tags($szoveg) .' ]]></description>  
  51.             </item>';  
  52.         }  
  53.         $items .= '</channel>  
  54.                 </rss>';  
  55.         return $items;  
  56.     }  
  57.   
  58. }  
Amivel beolvasom az kicsit szedett-vetett, mert nincs osztályba rakva. Csak a főbb funkciókat másolom ide.
  1. function startElement($parser$name$attrs) {  
  2.     global $insideitem$tag$title$description$link$pubdate;  
  3.     if ($insideitem) {  
  4.         $tag = $name;  
  5.     } elseif ($name == "ITEM") {  
  6.         $insideitem = true;  
  7.     }  
  8. }  
  9.   
  10. function endElement($parser$name) {  
  11.     global $insideitem$tag$title$description$link$pubdate;  
  12.     if ($name == "ITEM") {  
  13.     echo "<dt style='line-height:22px;'><b><a href='".$link."' target='_blank' style='color:#4c4a45;'>".karakter_kod($title)."</a></b> <span style='margin-left:15px;font-family:cursive'>";  
  14.     if($pubdate){echo cikk_datum_string($pubdate);}  
  15.     echo "</span></dt>";  
  16.   
  17.         $title = "";  
  18.         $description = "";  
  19.         $link = "";  
  20.         $pubdate = "";  
  21.         $insideitem = false;  
  22.     }  
  23. }  
  24.   
  25. function characterData($parser$data) {  
  26.     global $insideitem$tag$title$description$link$pubdate;  
  27.     if ($insideitem) {  
  28.     switch ($tag) {  
  29.         case "TITLE":  
  30.         $title .= $data;  
  31.         break;  
  32.         case "DESCRIPTION":  
  33.         $description .= $data;  
  34.         break;  
  35.         case "LINK":  
  36.         $link .= $data;  
  37.         break;  
  38.         case "PUBDATE":  
  39.         $pubdate .= $data;  
  40.         break;  
  41.     }  
  42.     }  
  43. }  
  44.   
  45. function xml_parsing($hivatkozas) {  
  46.  echo "<dl>";  
  47. $xml_parser = xml_parser_create();  
  48. xml_set_element_handler($xml_parser"startElement""endElement");  
  49. xml_set_character_data_handler($xml_parser"characterData");  
  50. $fp = fopen($hivatkozas,"r")  
  51.     or die("Error reading RSS data.");  
  52.       
  53. while ($data = fread($fp, 4096)) {  
  54.     xml_parse($xml_parser$datafeof($fp))  
  55.         or die(sprintf("XML error: %s at line %d",   
  56.             xml_error_string(xml_get_error_code($xml_parser)),   
  57.             xml_get_current_line_number($xml_parser)));  
  58.               
  59.               
  60. }  
  61. fclose($fp);  
  62. xml_parser_free($xml_parser);  
  63.  echo "</dl>";  
  64. }  
10

feldolgozást inkább

gex · 2009. Szep. 25. (P), 14.04
fentebb azt írtad hogy "Többek között, amit én generálok azt sem.", amiből arra következtetek hogy te mások rss-eit is fel akarod dolgozni ami szintén nem megy. logikus hogy nem a te rss-generálásodban keresendő először a hiba hanem a feldolgozásban.
ami persze nem zárja ki hogy a generálást is elrontod. :)
11

ok akkor pontosítok

nemalevi · 2009. Szep. 25. (P), 16.27
Az idegen oldalakról érkező rss közül egy volt, ami ugyanazt a hibát jelezte. De az is meg az enyém is, a hirlapom.hu-n vagy az Explorer feed olvasójában helyesen jelent meg.
14

esetleg másik

Drawain · 2009. Szep. 25. (P), 17.54
Nem tudom milyen PHP verziót, modulokat használsz, de ha elérhető a SimpleXML akkor inkább azzal érdemes beolvasni az RSS-t. Csökkenti a kódot és a hibalehetőségeket is így.

SimpleXML-es implementációra jó példa lehet a kohana framework RSS olvasója.

Esetedben leegyszerűsítve, "standalone" függvényként:
  1. function parse_rss($feed$limit = 0)  
  2. {  
  3.     // Make limit an integer  
  4.     $limit = (int) $limit;  
  5.   
  6.     // Disable error reporting while opening the feed  
  7.     $ER = error_reporting(0);  
  8.   
  9.     // Load the feed  
  10.     $feed = simplexml_load_file($feed'SimpleXMLElement', LIBXML_NOCDATA);  
  11.   
  12.     // Restore error reporting  
  13.     error_reporting($ER);  
  14.   
  15.     // Feed could not be loaded  
  16.     if ($feed === FALSE)  
  17.         return array();  
  18.   
  19.     // Detect the feed type. RSS 1.0/2.0 and Atom 1.0 are supported.  
  20.     $feed = isset($feed->channel) ? $feed->xpath('//item') : $feed->entry;  
  21.   
  22.     $i = 0;  
  23.     $items = array();  
  24.   
  25.     foreach ($feed as $item)  
  26.     {  
  27.         if ($limit > 0 AND $i++ === $limit)  
  28.             break;  
  29.   
  30.         $items[] = (array$item;  
  31.     }  
  32.   
  33.     return $items;  
  34. }  
Ez visszaadja egy tömbben a feldolgozott feed elemeket, amiket utána úgy formázod, ahogy csak akarod.
13

RSS

Poetro · 2009. Szep. 25. (P), 17.25
Még mindig nem láttuk a kérdéses "hibás" RSSeket.
15

Itt van

nemalevi · 2009. Szep. 25. (P), 18.11
Itt van az egyik.
A másik időközben megszünt.
16

ISO-8859-1

Poetro · 2009. Szep. 25. (P), 21.06
Azt ugye tudod, hogy ISO-8859-1 kódolás szerepel az XML fejlécben ugyanakkor mintha UTF-8 lenne a tartalom.
17

rejtély

nemalevi · 2009. Szep. 25. (P), 21.25
UTF-8-ba átírva már localhoston sem működik.
Na mindegy, kipróbálom ezt a SimpleXML-es megoldást.
Kösz mindenkinek!