Zur Navigation

xml einlesen

1 uwe

Hallo,
eine xml Datenbank soll gezeigt werden.

Ich habe ein script gefunden das den Aufbau zeigt.


<html>
<head>
<title>Die Struktur einer XML-Datei parsen</title>
</head>
<body>
<h1>Strukur einer XML-Datei</h1>
<?
$xml_parser = xml_parser_create(); // erzeugt neuen Parser
$daten = implode (file ("gb-daten.xml"), ""); // file() liest die Datei in ein Array ein
xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
xml_parser_free ($xml_parser);
?>
<table border="1" width="80%">
<tr>
<th>Tag</th>
<th>Typ</th>
<th>Ebene</th>
<th>Wert</th>
</tr>
<?
foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
print "<tr>";
print "<td>".$w["tag"]."</td>";
print "<td>".$w["type"]."</td>";
print "<td>".$w["level"]."</td>";
print "<td>".$w["value"]."</td>";
print "</tr>";
}
?>
</table>
</body>
</hmtl>

--------------------------------

Ich will die Datei anzeigen lassen NUR mit dem Feld "Nachricht".

Die Nachricht beginnt immer mit
#25.08.-9.9.2007[br]
zum Beispiel.

Die Ausgabe soll das Datum FETT schreiben, dann einen <br> und dann die Nachricht.

Gruss Uwe

28.10.2007 07:36 | geändert von Jörg: 25.12.2008 18:01

2 Jörg Kruse

Hallo Uwe,

Ich will die Datei anzeigen lassen NUR mit dem Feld "Nachricht".

Das sollte kein Problem sein - dazu gibst du einfach nur $w["value"] aus und lässt die anderen weg. Du kannst das ganze aber noch in ein if Konstrukt einbauen, welches überprüft, ob eine Nachricht in dem Datensatz enthalten ist

foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
    if ($w["tag"] == "NACHRICHT") {
        echo "<p>".$w["value"]."</p>";
    }
}

Die Ausgabe soll das Datum FETT schreiben

Das einfachste wäre es wohl, das Datum in ein eigene Spalte zu speichern, oder zumindest die Fettmarkierung als BBCode mit zu speichern.

Andernfalls kannst du versuchen, mit preg_replace den Abschnitt zwischen # und [br] fett zu markieren, also in etwa so (ungetestet):

$value = preg_replace('/#(.+)[br]/iU', '#<strong>$1</strong>[br]', $w["value"]);

Ebenso kannst du die [br] durch <br> ersetzen:

$value = preg_replace('/[br]/i', '<br>', $value);

(Die Ersetzungen sollten natürlich vor der Ausgabe erfolgen)

28.10.2007 10:17

3 uwe

Danke Jörg,
es geht schon besser.


Aber so ganz noch nicht.
Das [br] verschiebt sich.

(auch müssen die Umlaute noch richtig werden)

Hier mein versuch 4:

<html>
<head>
<title>Die Struktur einer XML-Datei parsen</title>
</head>
<body>
<h1>Strukur einer XML-Datei</h1>
<?
$xml_parser = xml_parser_create(); // erzeugt neuen Parser
$daten = implode (file ("gb-daten.xml"), ""); // file() liest die Datei in ein Array ein
xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
xml_parser_free ($xml_parser);
?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
if ($w["tag"] == "NACHRICHT") {

$value = preg_replace('/#(.+)[br]/iU', '#<strong>$1</strong>[br]', $w["value"]);

echo "<p>".$value."</p>";
}
}

?>
</table>
</body>
</hmtl>


----------
Hier mein versuch 5:

<html>
<head>
<title>Die Struktur einer XML-Datei parsen</title>
</head>
<body>
<h1>Strukur einer XML-Datei</h1>
<?
$xml_parser = xml_parser_create(); // erzeugt neuen Parser
$daten = implode (file ("gb-daten.xml"), ""); // file() liest die Datei in ein Array ein
xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
xml_parser_free ($xml_parser);
?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
if ($w["tag"] == "NACHRICHT") {

$value1 = preg_replace('/#(.+)[br]/iU', '#<strong>$1</strong>[br]', $w["value"]);
$value = preg_replace('[br]', '<br>', $value1);


echo "<p>".$value."</p>";
}
}

?>
</table>
</body>
</hmtl>

28.10.2007 12:24 | geändert von Jörg: 25.12.2008 18:02

4 Jörg Kruse

Ja, die "[" und "]" in den Mustern müssen noch escapet werden:

$value1 = preg_replace('/#(.+)\[br\]/iU', '#<strong>$1</strong>[br]', $w["value"]);
$value = preg_replace('\[br\]', '<br>', $value1);

(auch müssen die Umlaute noch richtig werden)

Die werden aber richtig angezeigt?

28.10.2007 12:49 | geändert: 25.12.2008 18:02

5 uwe

Hallo,
ich sehe bei mir aber Sonderzeichen ( falscher ASCII Code)
#
äüß sind falsch



Mit der Änderung
bekomme ich einen Fehler:
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in /home/www/s001w22/html/test/gb_lesen5a.php on line 21




<html>
<head>
<title>Die Struktur einer XML-Datei parsen</title>
</head>
<body>
<h1>Strukur einer XML-Datei</h1>
<?
$xml_parser = xml_parser_create(); // erzeugt neuen Parser
$daten = implode (file ("gb-daten.xml"), ""); // file() liest die Datei in ein Array ein
xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
xml_parser_free ($xml_parser);
?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
if ($w["tag"] == "NACHRICHT") {


$value1 = preg_replace('/#(.+)\[br\]/iU', '#<strong>$1</strong>[br]', $w["value"]);
$value = preg_replace('\[br\]', '<br>', $value1);

echo "<p>".$value."</p>";
}
}

?>
</table>
</body>
</hmtl>

28.10.2007 13:18 | geändert von Jörg: 25.12.2008 18:03

6 Jörg Kruse

Mit der Änderung
bekomme ich einen Fehler:
Warning: preg_replace() [function.preg-replace]: Delimiter must not be alphanumeric or backslash in /home/www/s001w22/html/test/gb_lesen5a.php on line 21

Die Begrenzungszeichen müssen noch rein:

$value = preg_replace('/\[br\]/i', '<br>', $value);

ich sehe bei mir aber Sonderzeichen ( falscher ASCII Code)
#
äüß sind falsch

Als was werden sie denn bwei dir angezeigt?

Der Server übermittelt nicht, in welchem Zeichensatz die HTML-Seite angezeigt werden soll. Um Fehlanzeigen des Browsers zu vermeiden, wäre es u.U. hilfreich, wenn dies noch im HTTP-Header oder in einer Metaangabe geschieht, z.B.:

<meta http-equiv="content-type" content="text/html; charset=utf-8">

28.10.2007 13:32 | geändert: 25.12.2008 18:03

7 uwe

Hallo Jörg,
danke für alles,
nur noch eine Kleinigkeit

Es ist noch ein # im Text, das muss noch weg.
wird schon fast alles richtig dargestellt.

Gruss
Uwe

<html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<head>
<title>Die Struktur einer XML-Datei parsen</title>
</head>
<body>
<h1>Strukur einer XML-Datei</h1>
<?
$xml_parser = xml_parser_create(); // erzeugt neuen Parser
$daten = implode (file ("gb-daten.xml"), ""); // file() liest die Datei in ein Array ein
xml_parse_into_struct ($xml_parser, $daten, &$werte, &$index); // parst XML-Datei in assoziativen Array
xml_parser_free ($xml_parser);
?>

<?

foreach ($werte as $w) { // Ausgabe der Daten des assoziativen Array
if ($w["tag"] == "NACHRICHT") {


$value1 = preg_replace('/#(.+)\[br\]/iU', '#<strong>$1</strong>[br]', $w["value"]);
$value = preg_replace('/\[br\]/i', '<br>', $value1);

echo "<p>".$value."</p>";
echo "------------";
}
}

?>
</table>
</body>
</hmtl>

28.10.2007 13:48 | geändert von Jörg: 25.12.2008 18:04

8 Jörg Kruse

Das erste # kannst du in dieser Ersetzung auch gleich mit entsorgen:

$value1 = preg_replace('/#(.+)\[br\]/iU', '<strong>$1</strong>[br]', $w["value"]);

Das letzte # kannst du abschließend mit substr() wegschneiden:

$value = substr($value, 0, -1);

28.10.2007 13:57

9 uwe

Hallo Jörg,
prima, besten Dank.

Schönen Sonntag noch

Gruss
Uwe

28.10.2007 14:53

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]