Mailinglisten-Archive |
Hi Oliver, Am Montag, 18. August 2003 04:13 schrieb Oliver \: [...] > Jetzt aber zur Problemstellung: > Ein User läd wöchentlich Aktualisierungen für seine Homepage als > Textdatei (bzw XML) hoch, die folgendermaßen aufgebaut ist: > <aktualisierung><artikel><id>A</id><titel>B</titel><beschreibung>C</b >eschrei > bung></artikel><artikel><id>AA</id><titel>BB</titel><beschreibung>CC< >/beschr eibung></artikel></aktualisierung> > Nun versuche ich, für jeden "artikel"-block die Werte zwischen den > Tags in entsprechende Variablen einzulesen, so dass soetwas ensteht: > $id = A > $titel = B > $beschreibung = C > Nur irgendwie will mir kein Weg einfallen, wie ich den > umgangssprachlichen Vorgang "Nimm alles, was zwischen den Tags XYZ > steht und packe es in die Variable mit dem entsprechenden Namen XYZ; > mache das für die komplette Datei" in Code umsetzen kann... mit sowas > hatte ich bisher nie zu tun :( es geht aus Deiner Mail nicht genau hervor, ob Deine XML-Datei zeilenweise aufgebaut ist. Die XML-Datei sollte zeilenweise aufgebaut sein, damit Du sie auch zeilenweise mit fgets() auslesen kannst. Das ist sicherer als das Auslesen der Datei auf einen Schlag mit file(), weil file() nach meiner Erfahrung beim Einlesen zu grosser Dateien mindestens Performanzprobleme mit sich bringt und ggf. sogar einen Fehler produziert. Relevante Seiten aus der Doku: - http://de.php.net/manual/de/ref.filesystem.php - http://de.php.net/manual/de/function.file.php - http://de.php.net/manual/de/function.fopen.php - http://de.php.net/manual/de/function.feof.php - http://de.php.net/manual/de/function.fgets.php - http://de.php.net/manual/de/function.fclose.php Also angenommen, Deine Datei sieht jetzt so aus: <aktualisierung> <artikel><id>A</id><titel>B</titel><beschreibung>C</beschreibung></artikel> <artikel><id>AA</id><titel>BB</titel><beschreibung>CC</beschreibung></artikel> </aktualisierung> Dann liest Du jetzt mit fgets() die Datei zeilenweise aus (Beispiel ist auf der Seite http://de.php.net/manual/de/function.fgets.php), wobei Du die erste und die letzte Zeile (<aktualisierung> / </aktualisierung>) auslaesst, und verarbeitest die Zeile z.B. wie folgt: Du ermittelst die Start- und Endposition des jeweiligen Tags mit strpos() und strrpos(). Die Differenz daraus plus die Laenge des Start-Tags ergibt dann die Laenge der Zeichenkette zwischen Start- und End-Tag. Mit diesen Werten schneidest Du dann mit substr() den enthaltenen Wert heraus. Beispiel, ungetestet: $iStart = strpos($sZeile, '<title>') + strlen('<title>'); $iEnde = strrpos($sZeile, '</title>'); $iLaenge = $iStart - $iEnde; $sInhalt = substr($zeile, $iStart, $iLaenge); Relevante Seiten aus der Doku: - http://de.php.net/manual/de/function.strpos.php - http://de.php.net/manual/de/function.strrpos.php - http://de.php.net/manual/de/function.strlen.php - http://de.php.net/manual/de/function.substr.php Wenn ich jetzt in der Fruehe nix falsch gemacht habe, sollte es so in etwa funktionieren. Bei regulaeren Ausdruecken bin ich auch nicht so bewandert. ;-) Da kann aber bestimmt jemand noch einen Loesungsansatz anbieten. :-) Fuer mehrere Tags sollest Du bei meinem Loesungsansatz oben dann eine Schleife durchlaufen lassen und in die Zeilen die Tags automatisch aus einem Array einsetzen und den Inhalt auch in einen Array schreiben und von dort spaeter wieder auslesen. :-) Viele Gruesse Lutz
php::bar PHP Wiki - Listenarchive