Entw.: IE-Programmierung (2)

Der Internet Exploxer vom Windows-Betriebssystem lässt sich direkt in einer Client-Applikation einbinden und programmieren. Im folgenden Artikel werden dazu einige Programmiertechniken gezeigt, mit denen man Web-Seiten automatisch auslesen und auswerten kann.
Es handelt sich hier um den 2. Teil einer Artikelserie.

Alle Texte zu einem Attributtyp

Diese rekursive Funktion liefert alle Texte bzw. Werte zu einem Attributtyp von allen DOM-Nodes unterhalb des vorgegebenen DOM-Node aNode:

function GetAllStringsForAttrType(const aNode: IHTMLDomNode;

            const aAttrType: String;

            var   aListe: TStringList): Boolean;

var

 l_oActNode, l_oNextNode, l_oChildNode: IHTMLDomNode;

 l_oAtt: IHTMLDOMAttribute2;

begin

 Assert(Assigned(aListe));

 if Assigned(aNode) then begin

   l_oActNode := aNode;

   repeat

     if GetAttributeByName(l_oActNode,aAttrType,l_oAtt) then begin

       if (l_oAtt.value <> '') and (l_oAtt.value <> 'null') then begin

         aListe.Add(l_oAtt.value);

       end;

     end;

     if l_oActNode.hasChildNodes then begin

       l_oChildNode := l_oActNode.FirstChild;

       GetAllStringsForAttrType(l_oChildNode,aAttrType,aListe);

     end;

     l_oNextNode := l_oActNode.NextSibling;

     l_oActNode := l_oNextNode;

   until not Assigned(l_oActNode);

 end;

 Result := aListe.Count > 0;

end;

Ermitteln aller Id's

Die Funktion ermittelt alle Id's von allen DOM-Nodes unterhalb des vorgegebenen DOM-Node aNode. Alle Id's werden in der String-Liste aListe gespeichert.

function GetAllIdNames(aNode: IHTMLDomNode;

            var aListe : TStringList): Boolean;

begin

 Assert(Assigned(aListe));

 aListe.Clear;

 Result := GetAllStringsForAttrType(aNode,'ID',aListe);

end;

Ermitteln aller Namen

Die Funktion ermittelt alle Namen von allen DOM-Nodes unterhalb des vorgegebenen DOM-Node aNode. Alle Namen werden in der String-Liste aListe gespeichert.

function GetAllNames(aNode: IHTMLDomNode;

            var aListe : TStringList): Boolean;

begin

 Assert(Assigned(aListe));

 aListe.Clear;

 Result := GetAllStringsForAttrType(aNode,'NAME',aListe);

end;

Ermitteln aller Klassen-Namen

Die Funktion ermittelt alle Klassennamen von allen DOM-Nodes unterhalb des vorgegebenen DOM-Node aNode. Alle Klassennamen werden in der String-Liste aListe gespeichert.

function GetAllClassNames(aNode: IHTMLDomNode;

            var aListe : TStringList): Boolean;

begin

 Assert(Assigned(aListe));

 aListe.Clear;

 Result := GetAllStringsForAttrType(aNode,'CLASS',aListe);

end;

Umwandeln von IHTMLDomNode und IHTMLElement

Bei der IE-Programmierung ist es oft notwendig, zwischen den Datentypen IHTMLDomNode und IHTMLElement zu wechseln. Dazu sollte man immer die Funktion Supports verwenden.

Beispiel 1: Umwandlung von IHTMLDomNode nach IHTMLElement:

var

 l_oHTMLDomNode:  IHTMLDomNode;

 l_oIHTMLElement: IHTMLElement;

begin

 l_oHTMLDomNode := ...

 if Supports(l_oHTMLDomNode, IHTMLElement, l_oIHTMLElement) then

    ...

 ...

end;

Beispiel 2: Umwandlung von IHTMLElement nach IHTMLDomNode:

var

 l_oHTMLDomNode:  IHTMLDomNode;

 l_oIHTMLElement: IHTMLElement;

begin

 l_oIHTMLElement := ...

 if Supports(l_oIHTMLElement, IHTMLDomNode, l_oHTMLDomNode) then

    ...

 ...

end;