xml-Datei aus Datenbankabfrage schreiben.

sid61

Mitglied
Hi,

Jeden Tag was neues dazu leren ;-)

Heute bastel ich an einer Funktion, die mir aus einer Datenbank abfrage eine xml Datei generieren soll, die ich später von anderen Anwendungen einbinden kann.

Jetzt bin ich schon mal soweit gekommen, das er mir eine Datei schreibt, aber es gibt einige Handycaps.

Nachfolgend habe ich mal den Code eingesetzt, zu besseren Verständnis.

Code:
<br><br><center><b>!!Fertsch!!</b></center>
<?php
include ("config.php");
$xml .= "<markers>\n";
		mysql_connect($host,$user,$password);
	@mysql_select_db($database) or die( "Unable to select database");
	$sql = "select lon, lat, name, type, id from jos_hp_properties";
	$result = mysql_query($sql) or DBError("LINE: " .__LINE__. " $sql");
	$nRows = mysql_num_rows($result);
       
	if ($nRows) {
		while ($row = mysql_fetch_assoc($result)) {
			$row{'name'} = addslashes($row{'name'});
			$row{'name'} = str_replace(';',',',$row{'name'});
                     $row{'type'}= $row{'type'};
                     $row{'id'}= $row{'id'};
			 $xml .= "<marker lat={$row{'lat'}} lng{$row{'lon'}} html={$row{'type'}}{$row{'id'}} label={$row{'name'}} />\n";
                 }
          }
       $xml .= '</markers>';
       $handle = fopen("datei.xml","w");
       fwrite($handle, $xml);
       fclose($handle);

function assertTable() {
}

function DBError($sql){
	print "Error: \n" . mysql_error() . "\n";
	print "<hr>\n";
	print "$sql\n";
	print "<hr>\n";
	exit;
}
?>

Folgendes Problem tritt dabei auf...

in dieser Zeile - $xml .= "<marker lat={$row{'lat'}} lng{$row{'lon'}} html={$row{'type'}}{$row{'id'}} label={$row{'name'}} />\n";

muss jeder Wert in Anführungszeichen gebettet sein - bekomme ich aber irgendwie nicht hin.

Beispiel der jetzt erzeugten Ausgabe - falsch:
<markers>
<marker lat=52.418844 lng=13.803177 html=11 label=Bootsschule Werlsee />
<marker lat=52.476341 lng=13.85303 html=22 label=Sink & SOS GmbH & Co.KG />
</markers>

Sie müßte aber so aussehen:
<markers>
<marker lat="52.418844" lng="13.803177" html="11" label="Bootsschule Werlsee" />
<marker lat="52.476341" lng="13.85303" html="22" label="Sink & SOS GmbH & Co.KG" />
</markers>

Als ich das ganze mal händisch korrigiert hatte - um einfach nur zu sehen, ob es dann geht, kam vom Browser die Ernüchterung.

Es müssen vor der Ausgabe alle Zeichen, bzw. Sonderzeichen umgewandelt werden.
Das bdeutet eben $§&*üäöüÜÖÄß u.s.w.

Dehalb habe ich jetzt genau zwei Fragen, mit denen ich das erfolgreich lösen kann.

1.) Wie muss diese Zeile abgewandelt werden,
in dieser Zeile - $xml .= "<marker lat={$row{'lat'}} lng{$row{'lon'}} html={$row{'type'}}{$row{'id'}} label={$row{'name'}} />\n"; damit ich zusätzlich jeden Wert beginnend mit {$row{'xxx'}} in Anführungszeichen ausgeben kann ?

2.) Wie kann ich es realisieren, das die Datenbankausgabe in jedem Schleifendurchgang nachgeschaut wird, ob Sonderzeichen (außer "" und Leerzeichen) enthalten sind, die XML gemäß den erlaubten Zeichen umwandelt ?

Ich würde mich sehr freuen, wenn mir einer dazu was sagen könnte.

LG
Sid
 
Hi,

wenn Du Anführungszeichen innerhalb eines Strings ausgeben willst, musst Du die einfach nur escapen:

PHP:
$xml .= "<marker lat=\"{$row{'lat'}}\" ...

Wenn z.B. Umlaute falsch dargestellt sind, ist das eher ein Problem der Kodierung. Ein vernünftiger Editor, kann Dir die Datei in der Regel umwandeln. Für XML musst Du eigentlich nur htmlspecialchars auf die Daten anwenden.

LG
 
Hi Kuddeldaddeldu - ich muss mich mal öffentlich bedanken :):):)
Du bist für den Suchenden in diesem Forum eine wirkliche Bereicherung.
Kein böses Wort, kein genervt sein von Anfängern wie mir und immer eine Lösung, die einem wirklich hilft !

Vielen Dank.

Ich habe nun die Änderungen vorgenommen und es läuft ganz prima !

htmlspecialchars hatte nicht ganz gereicht - die Umlaute waren noch wirr...
Hatte dann nochmal an verschiedenen Stellen gelesen und das dann so lösen können..

$row{'name'} = htmlspecialchars(htmlentities($row['name']));

Das hat dann gepasst und die Umlaute werden auch korrekt umgewandelt.

Vielen Dank nochmal für deine Hilfe !!

LG
sid
 
Zurück