Halihallo andi
ich möchte mit php und sax dokumente nach bestimmten tags abgrasen und diese verarbeiten - der rest wird 1:1 ausgegeben.
Wäre es nicht denkbar dies ganz ohne SAX/DOM Parser zu tun?
Stichwort: Regular Expressions oder ein eigener Algorithmus?
muss ich denn die tags, die ich ohnehin nur wieder ausgebe (also der grösste teil des dokumentes) auch durch meine start/end-funktionen schicken, oder gibt es so eine art 'override' funktion? ich könnte mir vortsellen, dass das meiner performance zugute kommen würde.
Ja, das käme der Performance natürlich zu gute. Aber ich habe noch
keine PHP-SAX-Anweisung gesehen, mit welcher man den Input partiell
parsed. Nur vielleicht soviel: SAX arbeitet Streamorientiert, dass
heisst: Du kannst Input zum Parser senden oder auch nicht, er
generiert vom diesem einfach die Callbacks (Achte nur darauf, dass
selbst beim Nichtsenden von Input das Dokument immer noch wellformed
bleibt).
// halb-pseudocode, der so ohne Anpassung sicher nicht funktioniert ;)
// ich will einfach mal die Idee vermitteln...
while ($data = fread($fp, 4096)) {
if (<zu verarbeitender Content in $data>) {
if (!xml_parse($xml_parser, $data, feof($fp))) {
die(sprintf("XML error: %s at line %d\n",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser)));
}
} else {
echo($data); // gleich ausgeben, ohne zu parsen...
}
}
Das Problem ist hier einfach, dass du im Beispiel einen 4096-Byte
Buffer hast und somit eine Node inmitten getrennt sein kann. Dem
Parser ist dies solange egal, bis du Teile davon nicht mehr durch den
Parser laufen lässt. Es ist also höchste Vorsicht geboten und die
Programmierung wird nicht einfach. Zudem müsstest du einzelne Teile
so zerstückeln und wieder zusammenfügen, dass genau alle irrelevanten
Inhalte direkt ausgegeben werden und alle Relevanten durch den Parser
gejagt werden.
Naja, ich wollte dich nur auf die Möglichkeit hinweisen. Ob du dies
wirklich in Angriff nehmen möchtest...?
gäbe es einen grund (ausser der komfortabilität beim suchen und ersetzen), den DOM zu benutzen?
Also zumindest für dieses Problem wo es dir eben um Performance geht,
ist DOM absolut nicht zu empfehlen. DOM arbeitet über den Daumen
gesagt ca. 10 mal langsamer.
Viele Grüsse
Philipp