Hi.
Was gibt das für einen Sinn? Wenn keine Umlaute vorkommen, erzeugt ein Textknoten doch auch nur ein Ereignis.
Ob das Vorgehen von SAX dir sinnvoll erscheint oder nicht, hat ja nichts damit zu tun, ob es den Entwicklern sinnvoll erschien. :)
Nein, natürlich nicht. Ich befasse mich noch nicht lange mit SAX. War vielleicht eine nicht richtig durchdachte Frage :)
Mir erscheint es jedenfalls sehr sinnvoll, wenn man sich folgendes überlegt: SAX ist ein nichtspeichernder Parser, d.h. es wird kein XML-Dokumentenbaum aufgebaut, der im Speicher gehalten werden muß, sondern es werden alle Datenbruchstücke, die in SAX hineingegeben werden, direkt durch eventgesteuerte Aktionen sofort wieder rausgegeben.
Das habe ich bereits als Vorteil gegüber DomDocument gekannt. So gesehen ist natürlich auch eine Zerstückelung eines Textknotens sinnvoll, wenn der Speicherbedarf niedrig bleiben soll, der Textknoten aber sehr groß ist. Das sehe ich ein.
Denn es ist ja durchaus erlaubt und möglich, eine riesige XML-Datei in mundgerechte Stückchen á 1024 Byte in SAX einzuspeisen - bei solch einer Vorgehensweise ist nie garantiert, dass ein Textknoten immer vollständig übergeben wird, d.h. er kann auch in zwei Arbeitsgängen übergeben werden. SAX merkt sich nur, in welchem Zustand es nach dem Aufruf war, d.h. welche Tags geöffnet waren, und ob der Datenstrom ggf. mitten in einem Tag fortgesetzt wird, usw.
»»
Ist das (1024 Byte) die Obergrenze, was maximal in einem Event als Textmenge zurückgegeben wird, oder hast Du die Zahl einfach mal in den Raum geworfen?
Das bedeutet aber, dass der auswertende Code eben damit rechnen muß, dass ein Textknoten in mehreren Schüben an den entsprechenden Eventhandler übergeben wird. Und offenbar passiert genau das auch ohne Unterbrechung des Datenstromes an den Stellen, wo sowas wie "Sonderzeichen" vorkommen.
»»
Ich habe es jetzt so gemacht, dass ich den Textknoten zunächst sammel und beim Schließen des Tags im Array speichere. Funzt perfekt. Das war eine große Hilfe von Dir.
Aber den Sinn einer Zerstückelung bei Sonderzeichen sehe ich immer noch nicht.
Diese Vorgehensweise ist übrigens in der PHP-Doku auch beschrieben.
Link?
Ich habe nur das gefunden:
xml_set_character_data_handler()
Genau dort. :) http://de.php.net/manual/en/function.xml-set-character-data-handler.php
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.
Character data handler is called for every piece of a text in the XML document. It can be called multiple times inside each fragment (e.g. for non-ASCII strings).
»»
Das sehe ich nicht. Ich habe die Offline-Version des PHP-Manuals. Vielleicht ist meine Version veraltet?
"multiple times inside each fragment"...
Ja natürlich. UTF-8 verwendet zwischen einem und vier Bytes pro Zeichen. Da PHP das Unicode in den normalen Stringfunktionen nicht "versteht", sondern nur byteorientiert arbeitet, gibt strlen() halt einen Wert zurück, den du nicht "erwartest", der aber hinsichtlich des Speicherbedarfs korrekt ist.
»»
Ok, das leuchtet mir ein.
Die korrekte Stringlänge in ZEICHEN erhälst du, wenn du die Multibyte-Stringfunktionen verwendest. Die analoge Funktion zur herkömmlichen PHP-Stringfunktion erhälst du grundsätzlich, indem du "mb_" voranstellst, und damit dann in der Doku suchst. Für strlen z.B.: http://de.php.net/manual/en/function.mb-strlen.php.
Wieder was gelernt. Von der Funktion habe ich noch nie gehört. Vielen Dank!