---
title: "XML Parser"
url: "https://www.typo3.net/d/32579-xml-parser"
source: "typo3.net"
tags: ["Extensions","Entwicklung","Frage"]
created: "2005-11-01"
last_reply: "2005-11-03"
replies: 8
solved: false
page: 1
pages: 1
lang: "de"
---

# XML Parser

Extensions › Entwicklung · 8 Antworten · gestartet 2005-11-01

## Eröffnungsbeitrag

**frankeefoo** · 2005-11-01 · [Beitrag #1](https://www.typo3.net/d/32579-xml-parser/1)

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
<?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:

```typoscript
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):

```html
<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

## Antworten

### [#2](https://www.typo3.net/d/32579-xml-parser/2) · steffenk · 2005-11-01

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.

### [#3](https://www.typo3.net/d/32579-xml-parser/3) · frankeefoo · 2005-11-01

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

```php
<?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#

### [#4](https://www.typo3.net/d/32579-xml-parser/4) · frankeefoo · 2005-11-01

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#

### [#5](https://www.typo3.net/d/32579-xml-parser/5) · steffenk · 2005-11-01

kleine Anmerkung von typo3.org:

> D E P R E C I A T E D
> Regarding to Mathias Schreiber at the typo3 mailinglist the usage of PHP_SCRIPT is considered D E P R E C I A T E D.
>
> Use USER (cached) or USER_INT (non cached) instead.

=> <http://typo3.org/documentation/document-library/doc_tut_frontend/The_better_life_with/>

Es ist auch besser, es in eine Klasse zu fassen, TS wird auch in einer Klasse ausgeführt.

Ausserdem soll man $content nicht via echo ausgeben.[/url]

### [#6](https://www.typo3.net/d/32579-xml-parser/6) · frankeefoo · 2005-11-01

vielen dank für die rasche antwort. :D  ich werde mir die sache mit USER / USER _INT genau anschauen.

### [#7](https://www.typo3.net/d/32579-xml-parser/7) · frankeefoo · 2005-11-02

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!

### [#8](https://www.typo3.net/d/32579-xml-parser/8) · steffenk · 2005-11-02

das hat was mit dem NAMESPACE zu tun.
<https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/ContentObjects/UserAndUserInt/Index.html>
hier kannst Du es nachlesen  ;)

### [#9](https://www.typo3.net/d/32579-xml-parser/9) · frankeefoo · 2005-11-03

danke für den link. aber eigentlich finde ich dort keine antwort darauf, weshalb es nicht mit PHP_SCRIPT funzt.   :o

---

Quelle: „XML Parser“, typo3.net, https://www.typo3.net/d/32579-xml-parser
Beiträge von Mitgliedern des Forums. Bitte mit Link auf die Diskussion zitieren.
