Hallo,
Zitat:
Die obige Prozedur speichert den Text zwischen <pre> </pre> nur bis zum 1. Vorkommen eines <br>, der Rest wird nicht mehr mitgenommen. [...] Muss ich da noch eine Schleife über die <br> Knoten hinzufügen ?
Leider ist mir nicht klar was Du mit einer Schleife über die BR-Knoten meinst.
Dein
Code:
<div class="fftText">
<pre>Das ist der 1. Satz<br>Und dies ist der 2. Satz. In diesem Falle mit X<br>Ich mag auch mit !</pre>
</div>
Kann man sich als
DOM-Baumstruktur so vorstellen ([-] heißt es existieren Kindknoten, eingerückt heißt Knoten auf derselben Ebene):
Code:
[-]<div class="fftText">
[-]<pre>
Das ist der 1. Satz
<br>
Und dies ist der 2. Satz. In diesem Falle mit X
<br>
Ich mag auch mit !
Wenn Dich die Kinder eines gegeben
DOM-Knotens interessieren, dann gibt Dir
Node := Node.firstChild;
die Referenz auf den ersten Kindknoten - oder nil, falls kein Kindknoten existiert. Wenn Du den DIV-Knoten an
procedure AddFFTText (Node : IHTMLDOMNode; var S : string);
übergibst, dann liefert die erste Zuweisung den PRE-Knoten und die zweite Zuweisung den Textknoten "Das ist der 1. Satz".
Möchtest Du
DOM-Knoten auf derselben Ebene untersuchen, dann sind die Zuweisungen:
Node := Node.nextSibling;
bzw.
Node := Node.previousSibling;
hilfreich; erstere liefert eine Referenz auf den nächsten Kindknoten, letztere eine Referenz auf den vorherigen Kindknoten derselben Ebene.
Wenn Du nur die Kinder der ersten Ebene des PRE-Knotens und dann auch nur Textknoten berücksichtigen möchtest: das erste Kind holen, solange diese Knoteneben durchlaufen bis kein weiterer Knoten mehr vorhanden ist, dabei jeden Knoten prüfen, ob es ein Textknoten ist - alles andere links liegen lassen.
In Code gegossen:
Delphi-Quellcode:
procedure AddFFTText (Node : IHTMLDOMNode;
var S :
string);
begin
if not (DOMNodeTagNameIs (Node, '
div')
and DOMNodeClassNameIs (Node, '
fftText'))
then
Exception.Create ('
Fehlermeldung');
Node := Node.firstChild;
if not DOMNodeTagNameIs (Node, '
pre')
then
Exception.Create ('
Fehlermeldung');
Node := Node.firstChild;
while Assigned (Node)
do
begin
if DOMNodeIsTextNode (Node)
then
AddNodeValue (Node, S);
Node := Node.nextSibling
end
end;
Dann ist auch "Ich mag auch mit !" mit von der Partie.
Ich hoffe ich konnte Deine Frage beantworten.
Zu Deiner Anmerkung:
Result := e.className = Name //richtig ist: e._className
kann gut sein, dass es ab XE5 oder XE6 mit Unterstrich sein muss.
Und was war da mit der
Access violation. Kannst Du dazu mehr sagen?
Gruß