Philipp Hasenfratz: wann ruft der Parser 'expat' Funktionen auf?

Beitrag lesen

Halihallo Andreas

//Handler für Daten ( CDATA ) setzen

Der wird auch bei PCDATA aufgerufen ;)
Und zwar, was du noch merken wirst, falls ein Entity geparsed werden
soll genau einmal für das Entity alleine.

z.B. wird 'hello&world' dreimal data() aufrufen.

stelle ich fest, daß diese Funktion nicht etwa einmal für "Absatztitel" und einmal für "Absatztext" aufgerufen wird, sondern andauernd. Z.B. auch zwischen "</title>" und "<para>" und bei Leerzeichen im Text usw.

Richtig.
http://www.xml.com/pub/a/1999/09/expat/index.html?page=3
<cite>
A single block of contiguous text free of markup may still result in a sequence of calls to this handler. In other words, if you're searching for a pattern in the text, it may be split across calls to this handler.
</cite>

Soweit ich es gesehen habe, wird für jeden Zeilenumbruch, für
jedes Entity, sowie nach dem Zeilenumbruch die Leerschläge bis zum
ersten nicht-Leerschlag der CharacterData-Handler aufgerufen.

Es ist eigentlich auch völlig egal, wann genau er aufgerufen wird.
Beim Programmieren muss man sich einfach bewusst sein, dass er
einfach "irgendwie" aufgerufen wird. Dass die Reihenfolge stimmt und
der Inhalt komplett ist, ist das einzige was man zu wissen braucht.

Das Zusammenhängen der einzelnen, separaten CharacterData-Strings,
nennt man normalize. Bei XML-DOM gibt es eine entsprechende Methode,
die dies dem Programmierer abnimmt. Bei Expat musst du eine
entsprechende Funktion selber schreiben.

Keine Ahnung, wie bringe ich das Teil dazu den Text innerhalb zweier zusammengehöriger Tags als _ein_ Ganzes aufzufassen?

Schreib dir eine eigene normalize-Funktion...

Ich kann dir hierbei einen Ansatz geben:
Wann immer der CharacterHandler aufgerufen wird, hängst du den Text
an eine (globale) Variable an. Falls ein anderer Handler (z.B. Start)
aufgerufen wird, rufst du einen eigenen Handler "RealCharacterData"
auf, dem du diese (globale) Variable übergibst (natürlich bevor der
andere Handler Aktionen zum Verarbeiten vornimmt).

So hast du sozusagen ein erweitertes Expat-Handler-Handling, wo
der (dein eigener) CharacterData-Handler auf normalisierten
Textnodes operiert.

Viele Grüsse

Philipp

--
The only program that runs perfectly every time, is a virus.