Hi.
Deine Beobachtung entspricht aber vollkommen der dokumentierten Funktionsweise von SAX. Es handelt sich hierbei um einen eventgesteuerten XML-Parser, d.h. du fütterst in ihn ein Fragment von XML hinein, und er parst das Stück und ruft intern passend zu den gefundenen Teilen die entsprechenden Funktionen auf, welche dann die gewünschten Maßnahmen ergreifen, um das XML-Fragment in geeigneten anderen Datenstrukturen zu speichern.
Dein Irrtum liegt darin, dass du glaubst, für den Textblock "Entität" würde dein Eventhandler für "character data" garantiert nur ein einziges Mal aufgerufen. Diese Annahme ist falsch. SAX könnte durchaus deinen Eventhandler für jeden Buchstaben einzeln aufrufen!
Was gibt das für einen Sinn? Wenn keine Umlaute vorkommen, erzeugt ein Textknoten doch auch nur ein Ereignis.
»»Das muß dein Code berücksichtigen, er muß sich also merken, ob das Elementende "</titel>" schon gefunden wurde - solange das nicht der Fall ist, muß deine Funktion für Character Data alle gefundenen Zeichen sammeln und in einen String speichern.
»»
Wenn es nicht anders geht, dann halt so.
Diese Vorgehensweise ist übrigens in der PHP-Doku auch beschrieben.
Link?
Ich habe nur das gefunden:
xml_set_character_data_handler()
Character data is roughly all the non-markup contents of XML documents, including whitespace between tags. Note that the XML parser does not add or remove any whitespace, it is up to the application (you) to decide whether whitespace is significant.
Ohne Angaben zum Encoding wird der Browser "irgendwas" benutzten - in deinem Fall wohl ISO-8859-1.
Das hat in der Tat nichts mit der Zweiteiligkeit deines Parsergebnisses zu tun, aber mit der falschen Ausgabe des Umlauts schon.
Mag sein. Aber der Umlaut wird schon falsch im Array gespeichert. Das habe ich mit strlen() geprüft, was für den Umlaut zwei Zeichen statt eines ergibt. Oder wird ein UTF-8-Umlaut mit zwei Bytes gespeichert?