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?

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.

class RSS
  {
	public function RSS()
	{
		require_once ('mysql_connect.php');
	}

	public function GetFeed()
	{
		return $this->getDetails() . $this->getItems();
	}

	private function dbConnect()
	{
		DEFINE ('LINK', mysql_connect (DB_HOST, DB_USER, DB_PASSWORD));
	}
	

	private function getDetails()
	{
			$details = '<?xml version="1.0" encoding="ISO-8859-1"?>
				<rss version="2.0">
					<channel>
						<title><![CDATA[ Title ]]></title>
						<link>http://honlap.hu</link>
						<description></description>
						<language>hu-HU</language>
						<generator></generator>
						';
	
		return $details;
	}

	private function getItems()
	{
		$itemsTable = "index_oldal";
		$this->dbConnect($itemsTable);
		$query = "SELECT * FROM ". $itemsTable ." ORDER BY id DESC LIMIT 10";
		$result = mysql_db_query (DB_NAME, $query, LINK);
		$items = '';
		while($row = mysql_fetch_array($result))
		{
		 $cikk_tomb = explode(" ", $row['text']);
		 $elvalasztas = $cikk_tomb[32]." ".$cikk_tomb[33];
		 $elvalasztas_ket_reszre = explode($elvalasztas, $row['text']);
		 $szoveg = $elvalasztas_ket_reszre[0].'...';
			$items .= '<item>
				<title>'. $row["cim"] .'</title>
				<link>http://www.honlap.hu/index.php?article='. $row['id'] .'</link>
				<description><![CDATA[ '.  strip_tags($szoveg) .' ]]></description>
			</item>';
		}
		$items .= '</channel>
				</rss>';
		return $items;
	}

}
Amivel beolvasom az kicsit szedett-vetett, mert nincs osztályba rakva. Csak a főbb funkciókat másolom ide.

function startElement($parser, $name, $attrs) {
	global $insideitem, $tag, $title, $description, $link, $pubdate;
	if ($insideitem) {
		$tag = $name;
	} elseif ($name == "ITEM") {
		$insideitem = true;
	}
}

function endElement($parser, $name) {
	global $insideitem, $tag, $title, $description, $link, $pubdate;
	if ($name == "ITEM") {
	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'>";
	if($pubdate){echo cikk_datum_string($pubdate);}
	echo "</span></dt>";

		$title = "";
		$description = "";
		$link = "";
		$pubdate = "";
		$insideitem = false;
	}
}

function characterData($parser, $data) {
	global $insideitem, $tag, $title, $description, $link, $pubdate;
	if ($insideitem) {
	switch ($tag) {
		case "TITLE":
		$title .= $data;
		break;
		case "DESCRIPTION":
		$description .= $data;
		break;
		case "LINK":
		$link .= $data;
		break;
		case "PUBDATE":
		$pubdate .= $data;
		break;
	}
	}
}

function xml_parsing($hivatkozas) {
 echo "<dl>";
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen($hivatkozas,"r")
	or die("Error reading RSS data.");
	
while ($data = fread($fp, 4096)) {
	xml_parse($xml_parser, $data, feof($fp))
		or die(sprintf("XML error: %s at line %d", 
			xml_error_string(xml_get_error_code($xml_parser)), 
			xml_get_current_line_number($xml_parser)));
			
			
}
fclose($fp);
xml_parser_free($xml_parser);
 echo "</dl>";
}
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:

function parse_rss($feed, $limit = 0)
{
	// Make limit an integer
	$limit = (int) $limit;

	// Disable error reporting while opening the feed
	$ER = error_reporting(0);

	// Load the feed
	$feed = simplexml_load_file($feed, 'SimpleXMLElement', LIBXML_NOCDATA);

	// Restore error reporting
	error_reporting($ER);

	// Feed could not be loaded
	if ($feed === FALSE)
		return array();

	// Detect the feed type. RSS 1.0/2.0 and Atom 1.0 are supported.
	$feed = isset($feed->channel) ? $feed->xpath('//item') : $feed->entry;

	$i = 0;
	$items = array();

	foreach ($feed as $item)
	{
		if ($limit > 0 AND $i++ === $limit)
			break;

		$items[] = (array) $item;
	}

	return $items;
}
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!