xml_set_character_data_handler: Beware of chunks!
19.05.2008Die Behandlung von Character Data mit PHPs XML Parser (basierend auf James Clarks expat) weist eine undokumentierte Eigenart auf. Die jeweils definierte Callback-Funktion für Character Data, z. B.
…
xml_set_character_data_handler($this->sax, 'data');
...
private function data($sax, $data) {
$this->data .= (string) $data;
}
wird Datengrößen-bedingt mehrfach gerufen (siehe http://www.php.net/manual/en/function.xml…).
Ich konnte das Splitting-Phänomen für CDATA-Sections sowie “einfache” Strings, die Umlaute enthalten, wie folgt nachvollziehen:
CDATA-Sections: “”, Inhalt CDATA-Section, “”. Also drei Iterationen mit dem Muster [empty], [Daten], [empty].
Einfache Strings mit Umlauten, z. B. “Hallö Günther”: “”, “”, “”, “”, “”, “”, “Hall”, “ö Günther”. Also acht Iterationen mit diesem Muster: Alles vor dem ersten Umlaut wird in der vorletzten Iteration erfasst, der Rest in der letzten.
Ohne Concatenation-Operator (.) in der Wertezuweisung wird man hier also vergeblich auf den vollständigen Zeichendaten-Inhalt warten. Das obige Beispiel ist bereits entsprechend korrigiert.