Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#8

AW: DIV classes mit getElementByID auslesen

  Alt 21. Mai 2014, 22:14
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ß
Volker Zeller
  Mit Zitat antworten Zitat