Zum Inhalt springen

XML Parser

Erstellt am 1. November 2005 · 8 Antworten · letzte Antwort am 3. November 2005

Tags: Frage

frankeefoo ·

Liebe Typo3 Freunde 🙂,

ich habe ein PHP Script geschrieben, welches ein XML File eines Parkhauses parst und ausgibt, wieviele Parkplätze frei bzw. besetzt sind:

<?php

$bool_1 = false;
$bool_2 = false;
$bool_3 = false;
$bool_4 = false;
$timestamp = false;

$int_Belegung;
$int_Frei;

// run when start tag is found
function startElementHandler($parser, $name, $attrubutes)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $timestamp;
	
	if($name == "PARKHAUS") {
		$bool_1 = true;
	}
		
	if($bool_1 == true && $name == "BELEGUNG_KURZ") {
		$bool_2 = true;
	}
	
	if($bool_1 == true && $name == "RESTPLAETZE_KURZ") {
		$bool_3 = true;
	}

	if($name == "ZEITSTEMPEL") {
		$timestamp = true;
	}
}
	
// run when end tag is found
function endElementHandler($parser, $name)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $bool_4;
	global $timestamp;
	
	if($name == "PARKHAUS") {
		$bool_1 = false;
		$bool_4 = false;
	}
	
	if($name == "BELEGUNG_KURZ") $bool_2 = false;
	
	if($name == "RESTPLAETZE_KURZ") $bool_3 = false;
	
	if($name == "ZEITSTEMPEL") $timestamp = false;
}

// run when cdata is found
function characterDataHandler($parser, $cdata)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $bool_4;
	global $timestamp;
	
	global $int_Belegung;
	global $int_Frei;
		
	if(!strcmp("Bad. Bahnhof",$cdata)) {
		$bool_4 = true;
	}
	
	if($bool_2 && $bool_4) {
		$int_Belegung = $cdata;
	}
	
	if($bool_3 && $bool_4) {
		$int_Frei = $cdata;
	}
	
	if($timestamp) {
	}
}

	
// XML data file
$xml_file = "http://www.parkleitsystem-basel.ch/PPS_Basel.xml";

// initialize parser
$xml_parser = xml_parser_create();

// set callback functions
xml_set_element_handler($xml_parser, "startElementHandler", "endElementHandler");
xml_set_character_data_handler($xml_parser, "characterDataHandler");

// read XML File
if (!($fp = fopen($xml_file, "r")))
{
	die("File I/O error_ $xml_file");
}

// parse XML
while ($data = fread($fp, 4096))
{
	// error handler
	if (!xml_parse($xml_parser, $data, feof($fp)))
	{
		die("XML parser error: " . xml_error_string(xml_get_error_code($xml_parser)));
	}
}

// all done, cleain up!
xml_parser_free($xml_parser);

// now we hand the result to typo3
$content =  "
	<tr class="\&quot;statItemRow\&quot;">
		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" 39be00="" color:="" ffffff="">$int_Frei FREI</span></td>
	</tr>
	<tr class="\&quot;statSpacerRow\&quot;"></tr>

	<tr class="\&quot;statItemRow\&quot;">
		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" bd0000="" color:="" ffffff="">$int_Belegung BESETZT</span></td>
	</tr>
	<tr class="\&quot;statSpacerRow\&quot;"></tr>
	
	<tr class="\&quot;statItemRow\&quot;">
		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" efdb00="" color:="" 000000="">AKTUALISIEREN</span></td>
		</tr>
	<tr class="\&quot;statSpacerRow\&quot;"></tr>";

?>

Das Script habe ich im Setup mit folgenden Befehlen eingefügt:

temp.xmlparse = PHP_SCRIPT 
temp.xmlparse.file = media/scripts/xmlparse2.php

Der Link zur Seite:

http://www.visign.ch/pabag

Das Script habe ich ausserdem auf folgender Adresse als eigenständiges PHP Script installiert, damit Ihr Euch versichern könnt, dass es an sich funktioniert (das einzige was ich geändert habe, ist die Ausgabe der Variable $content, also die Zeile "echo $content;" am Schluss eingefügt:

http://www.visign.ch/parkhaus/xmlparse2.php

Das Problem ist nun, dass die Anzahl freier/besetzter Parkplätze, also die Variablen "$int_Frei" und $int_Belegung" in der Endausgabe nicht mit in den String aufgenommen werden.
Die Gewünsche Ausgabe, zu Unterst im Quelltext der Webpage zu finden, wäre folgendes (wie sie im eigenständigen Script oben auch herauskommt):

<tr class="statItemRow">
<td><span class="statItem" style="background-color: #39BE00; color: #FFFFFF">112 FREI</span></td>
</tr>
<tr class="statSpacerRow"></tr>
<tr class="statItemRow">
<td><span class="statItem" style="background-color: #BD0000; color: #FFFFFF">188 BESETZT</span></td>
</tr>
<tr class="statSpacerRow"></tr>
<tr class="statItemRow">
<td><span class="statItem" style="background-color: #EFDB00; color: #000000">AKTUALISIEREN</span></td>
</tr>
<tr class="statSpacerRow"></tr>

aber die Zahlen fehlen dann eben, wenn Typo3 das Script in die Seite integriert.

Ich wäre wirklich dankbar, wenn jemand eine Idee hätte.

Viele Grüsse,
Frankie

steffenk ·

ich vermute mal, das irgendwas mit den Quotes nicht stimmt (ist das die Forensoftware, die das so fälscht ?)

Versuch es auch mal mit der Ext php_page_content.

frankeefoo ·

danke steffen für deine antwort!
da gab es einen fehler beim copy&paste, hier nochmals der code mit den richtigen quotes:

<?php

$bool_1 = false;
$bool_2 = false;
$bool_3 = false;
$bool_4 = false;

$timestamp = false;

$int_Belegung;
$int_Frei;

// run when start tag is found
function startElementHandler($parser, $name, $attrubutes)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $timestamp;

	if($name == "PARKHAUS") {
		$bool_1 = true;
	}
	
	if($bool_1 == true && $name == "BELEGUNG_KURZ") {
		$bool_2 = true;
	}

	if($bool_1 == true && $name == "RESTPLAETZE_KURZ") {
		$bool_3 = true;
	}

	if($name == "ZEITSTEMPEL") {
		$timestamp = true;
	}
}

// run when end tag is found
function endElementHandler($parser, $name)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $bool_4;

	global $timestamp;

	if($name == "PARKHAUS") {
		$bool_1 = false;
		$bool_4 = false;
	}

	if($name == "BELEGUNG_KURZ") $bool_2 = false;

	if($name == "RESTPLAETZE_KURZ") $bool_3 = false;

	if($name == "ZEITSTEMPEL") $timestamp = false;
}

// run when cdata is found

function characterDataHandler($parser, $cdata)
{
	global $bool_1;
	global $bool_2;
	global $bool_3;
	global $bool_4;

	global $timestamp;

	global $int_Belegung;
	global $int_Frei;

	if(!strcmp("Bad. Bahnhof",$cdata)) {
		$bool_4 = true;
	}

	if($bool_2 && $bool_4) {
		$int_Belegung = $cdata;
	}

	if($bool_3 && $bool_4) {
		$int_Frei = $cdata;
	}

	if($timestamp) {
	}
}

// XML data file
$xml_file = "http://www.parkleitsystem-basel.ch/PPS_Basel.xml";

// initialize parser
$xml_parser = xml_parser_create();

// set callback functions
xml_set_element_handler($xml_parser, "startElementHandler", "endElementHandler");
xml_set_character_data_handler($xml_parser, "characterDataHandler");

// read XML File
if (!($fp = fopen($xml_file, "r")))

{
	die("File I/O error_ $xml_file");
}

// parse XML
while ($data = fread($fp, 4096))
{
	// error handler
	if (!xml_parse($xml_parser, $data, feof($fp)))
	{
		die("XML parser error: " . xml_error_string(xml_get_error_code($xml_parser)));
	}
}

// all done, cleain up!
xml_parser_free($xml_parser);

/ now we hand the result to typo3

$content =  "

	<tr class="\&quot;statItemRow\&quot;">

		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" 39be00="" color:="" ffffff="">$int_Frei FREI</span></td>

	</tr>

	<tr class="\&quot;statSpacerRow\&quot;"></tr>



	<tr class="\&quot;statItemRow\&quot;">

		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" bd0000="" color:="" ffffff="">$int_Belegung BESETZT</span></td>

	</tr>

	<tr class="\&quot;statSpacerRow\&quot;"></tr>

	

	<tr class="\&quot;statItemRow\&quot;">

		<td><span class="\&quot;statItem\&quot;" style="\&quot;background-color:" efdb00="" color:="" 000000="">AKTUALISIEREN</span></td>

		</tr>

	<tr class="\&quot;statSpacerRow\&quot;"></tr>";

echo $content;

?>

weshalb ich nicht php_page_content verwenden möchte: das script soll ins template integriert werden und nicht auf jeder seite als content element eingefügt. ein redaktor, der eine neue seite erstellt, soll nicht jedesmal das script auf der seite neu einbinden müssen.

jedenfalls: es liegt nich an den quotes, die waren nur hier im forum falsch. was kann es sonst noch sein? ich habe auch probiert, ein ganz primitives script anstelle des xml parsers zu integreiren - das problem bleibt das gleiche: wenn ich $content mit einem string auffülle, funktioniert es, wenn ich aber eine variable in $content hineinschreibe, wird diese nicht ausgegeben.

hilfe, bitte? #paralyzed#

frankeefoo ·

danke steffen für deine antwort!
da gab es einen fehler beim copy&paste. ich habs versucht zu korrigieren aber es kommt irgendwie immer wieder rein. aber schau dir einfach das html listing oben an, genau so sieht es auch aus.

weshalb ich nicht php_page_content verwenden möchte: das script soll ins template integriert werden und nicht auf jeder seite als content element eingefügt. ein redaktor, der eine neue seite erstellt, soll nicht jedesmal das script auf der seite neu einbinden müssen.

jedenfalls: es liegt nich an den quotes, die waren nur hier im forum falsch. was kann es sonst noch sein? ich habe auch probiert, ein ganz primitives script anstelle des xml parsers zu integreiren - das problem bleibt das gleiche: wenn ich $content mit einem string auffülle, funktioniert es, wenn ich aber eine variable in $content hineinschreibe, wird diese nicht ausgegeben.

hilfe, bitte? #paralyzed#

frankeefoo ·

mit PHP_SCRIPT_EXT habe ich es dann hingekriegt, und es war kinderleicht.

kann mir jemand sagen weshalb es nicht mit PHP_SCRIPT läuft? was genau ist der unterschied?

danke!