Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Klasse HTMLDocument (https://www.delphipraxis.net/180405-klasse-htmldocument.html)

Christian Seehase 18. Mai 2014 16:06

Klasse HTMLDocument
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin Zusammen,

da immer mal wieder jemand HTML-Dateien auseinander nehmen will, möchte ich hier meine Klasse zum Thema vorstellen.

Klasse: TcsHTMLDocument = class(TObjectList)
Hauptklasse

Allgemein gilt:
Bei der Suche nach HTML-Tags, Attributen und Attributwerten spielt die Gross-/Kleinschreibung keine Rolle.
Der Rückgabewert der Suchmethoden ist -1 falls das Element nicht gefunden wurde oder die Indexangaben ausserhalb des gültigen Bereiches liegen (<0 oder > Gesamtanzahl der Elemente-1).
Ansonsten ist es der Index des gesuchten Elements.


constructor Create;
Initialisiert das Objekt.

destructor Destroy; override;
Zerstört das Objekt.

procedure Clear; override;
Setzt alle Felder des Objektes zurück.

function FindElement(const AType : TcsHTMLElementType;const AsName : string;const AiStart : Integer) : Integer;
Suche nach einem HTML-Tag
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AiStart => Ab diesem Index wird nach dem Element gesucht

function FindContentIndex(const AiStart : Integer) : Integer;
Sucht nach dem nächsten Content.
AiStart => Ab diesem Index wird nach Content gesucht (hetContent,hetContentPre)

function FindElementBetween(const AType : TcsHTMLElementType;const AsName : string;const AiFrom : Integer;const AiTo : Integer) : Integer;
Sucht nach einem HTML-Tag zwischen zwei Indizes (jeweils inclusive)
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AiFrom => Ab diesem Index wird nach dem Element gesucht
AiTo => Bis zu diesem Index wird nach dem Element gesucht

function FindElementWithAttribValue(const AType : TcsHTMLElementType;const AsName : string;const AsAttrib : string;const AsAttribValue : string;const AiStart : Integer) : Integer;
Sucht nach einem HTML-Tag, dass ein Attribut mit einem bestimmten Wert enthält
AType => Typ des gesuchten Elements (hetStartTag,hetEndTag,hetStandaloneTag)
AsName => Name des gesuchten Elements
AsAttrib => Name des gesuchten Attributs

function FindMatchingTagsBetween(const AsName : string;const AiFrom : Integer;const AiTo : Integer;out AiStart : Integer;out AiEnd : Integer) : boolean;
Sucht nach zusammengehörigen Start-/Endtags zwischen zwei Indizes (jeweils inclusive)
AsName => Name des gesuchten HTML-Tags
AiFrom => Ab diesem Index wird nach dem Element gesucht
AiTo => Bis zu diesem Index wird nach dem Element gesucht

function ReadAttribValue(const AiIndex : Integer;const AsAttrib : string) : string;
Den Wert eines Attributs des Elements an AiIndex auslesen.
AiIndex => Das Element dieses Indizes wird verwendet.
Result => Der Wert des Attributs wird zurückgegeben, oder ein Leerstring, falls das Attribut nicht vorhanden ist oder AiIndex ausserhalb des gültigen Bereichs liegt.

procedure LoadContentFromFile(const AsFilepath : string);
Den auszuwertenden Inhalt aus einer Datei laden.
Nach dem Laden wird automatisch ausgewertet.

property Element[Index : integer]
Gibt das Element (Typ: TcsHTMLElement) an Index zurück.

property Base
Wert des HTML-Tags base bzw. dessen Attributs href.
Falls es nicht vorhanden ist enthält es einen Leerstring

property Root
Nicht genutzt.

property Images
Beim Auswerten des Inhalts werden hier alle Links auf Bilder zurückgegeben.
(Wert des Attributs src des HTML-Tags img)
Format:
<img>=Wert des Attributs src des HTML-Tags img

property Links
Beim Auswerten des Inhalts werden hier alle enthaltenen Ankerpunkte zurückgegben.
(Wert des Attributs href des HTML-Tags a)
Eventuelle #-Angaben werden hierbei abgeschnitten.
Format:
<c>=Content vor dem a-Tag<a>=Link<c>=Content nach dem a-Tag
Ist kein Content vorhanden ist jeweils nur <c>= vorhanden.

property Content
Kann der Inhalt einer HTML-Datei übergeben werden.
Durch das Zuweisen des Wertes wird automatisch die Auswertung gestartet.

Klasse: TcsHTMLElement = class(TObject)
Klasse für ein einzelnes Element der Datei.
Entweder ein HTML-Tag mit Attributen oder Content

constructor Create(const AsName : string;const AElementType : TcsHTMLElementType);
Initialisiert das Objekt
AsName => Der Name des HTML-Tags oder der Content
AElementType => Typ des Elements

destructor Destroy; override;
Zerstört das Objekt.

property Name
Name des Elements oder Content, je nach Typ des Elements

property ElementType
Typ des Elements

property Attribs
Die Liste der Attribute, falls es sich um ein HTML-Tag handelt.

Klasse: TcsHTMLAttribList = class(TObjectList)
Liste der Attribute eines HTML-Tags

function AddAttrib(const AsName : string;const AsValue : string) : Integer;
Fügt ein neues Attribut der Liste hinzu.
AsName => Name des Attributs
AsValue => Wert des Attributs. Der Wert ist nicht mehr in Anführungsstriche eingeschlossen.

property Attrib[Index : integer]
Gibt das Attribut (Typ: TcsHTMLAttrib) an Index zurück.

Klasse: TcsHTMLAttrib = class(TObject)
Klasse für ein einzelnes Attribut

constructor Create(const AsName : string;const AsValue : string);
Intitialisiert das Objekt.
AsName => Names des Attributs
AsValue => Wert des Attributs

property Name
Name des Attributs

property Value
Wert des Attributs (ohne Anführungsstriche)

Typ: TcsHTMLElementType
Eine Liste der Typen der Elemente
hetStartTag => Es handelt sich um ein Start-Tag (z.B. <head>)
hetEndTag => Es handelt sich um ein End-Tag (z.B. </head>)
hetStandaloneTag => Es handelt sich um ein Standalone-Tag (z.B. <br>)
hetContent => Inhalt zwischen HTML-Tags
hetContentPre => Vorformatierter Inhalt zwischen <pre>-Tags

Christian Seehase 21. Mai 2014 18:41

AW: Klasse HTMLDocument
 
Moin Zusammen,

hier mal ein kleines Beispiel.
(es bezieht sich auf diesen Thread: DIV classes mit getElementByID auslesen)


Delphi-Quellcode:
uses Clipbrd,csHTMLTypes;
{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);

var
  LDOC : TcsHTMLDocument;
  iPos : Integer;

  sName : string;
  sDate : string;
  sGroup : string;
  sText : string;

  iPreStart : Integer;
  iPreEnd  : Integer;

  i        : Integer;

begin
  LDOC := TcsHTMLDocument.Create;
  try
    LDOC.Content := Clipboard.AsText;
    iPos        := 0;
    sDate       := 'Not Found';
    sName       := 'Not Found';
    sGroup      := 'Not Found';
    sText       := 'Not Found';
    while True do begin
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'div','class','FFT_header',iPos);
      if iPos = -1 then Break;
      inc(iPos);
      sDate := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'span','class','FFT_header_for_name',iPos);
      if iPos = -1 then Break;
      Inc(iPos);
      sName := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'span','class','FFT_header_group',iPos);
      if iPos = -1 then Break;
      inc(iPos);
      sGroup := LDOC.Element[iPos].Name;
      iPos := LDOC.FindElementWithAttribValue(hetStartTag,'div','class','fftText',iPos);
      if iPos = -1 then Break;
      if not LDOC.FindMatchingTagsBetween('pre',iPos,LDOC.Count-1,iPreStart,iPreEnd) then Break;
      sText := '';
      for i := iPreStart to iPreEnd do begin
        if LDOC.Element[i].ElementType in [hetContent,hetContentPre] then begin
          sText := sText + LDOC.Element[i].Name;
        end else begin
          if LDOC.Element[i].ElementType = hetStandaloneTag then begin
            if LDOC.Element[i].Name = 'br' then begin
              sText := sText+#13#10;
            end;
          end;
        end;
      end;
      ShowMessage('Datum: '+sDate+#13#10+'Name: '+sName + #13#10+'Gruppe: '+sGroup+#13#10+'Text: '+sText);
      sDate       := 'Not Found';
      sName       := 'Not Found';
      sGroup      := 'Not Found';
      sText       := 'Not Found';
    end;
  finally
    LDOC.Free;
  end;
  Close;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz