Hallo zusammen,
habe ein Logik-Problem und hoffe es kann mir jemand weiterhelfen:
Eine Funktion soll eine
HTML-Tabelle als string zurückliefern:
Folgende Deklaration der Funktion:
function GetHTMLTable (AUrl: string; ATableID: integer): string;
Der Parameter ATableID ist die Tabelle, die zurückgeliefert werden soll.
Folgende Variablen:
Delphi-Quellcode:
var
cResult: string; //Der Rükgabewert
cSourceCode: string;
nTableStartPos: integer;
nTableEndPos: integer;
nOffSet: integer;
aTableCoordinatesArray: Array of TTableCoordinates; //TTableCoordinates ist ein Record mit den beiden Felden TableStartPos und TableEndPos
nTableCoordinatesArraySize: integer;
nI: integer; //Schleifenvariable
Zunächst die Initialisierung einiger Variablen:
Delphi-Quellcode:
cSourceCode := GetSourceCode(AUrl); //GetSourceCode ist eine eigene Funktion, die mittels TIdHTTP den Sourcecode einer Website liefert. AUrl wurde als Argument an die Funktion geliefert.
nTableStartPos := Pos(tblStartIdentifier, cSourceCode); //defniert das erste Vorkommen von tblStartIdentifier (String-Konstante= '<table')
nTableEndPos := Pos(tblEndIdentifier, cSourceCode); //defniert das erste Vorkommen von tblEndIdentifier (String-Konstante= '</table>')
nTableCoordinatesArraySize := 0;
Dann wird das Array aTableCoordinatesArray mit allen vorkommenden Positionen von '<table' in cSourceCode gefüttert:
Delphi-Quellcode:
while nTableStartPos > 0 do
begin
Inc(nTableCoordinatesArraySize); //Größe des Arrays definieren
SetLength(aTableCoordinatesArray, nTableCoordinatesArraySize); //Größe des Arrays definieren
aTableCoordinatesArray[nTableCoordinatesArraySize-1].TableStartPos := nTableStartPos;
nOffSet := nTableStartPos + Length(tblStartIdentifier); //Offset hinter die letzte gefundene Position setzen
nTableStartPos := PosEx(tblStartIdentifier, cSourceCode, nOffSet); //schauen, ob's ein weiteres '<table' gibt
end;
So weit so gut. Es fehlen die Positionen der End-Tags. Die werden folgendermaßen eingelesen:
Delphi-Quellcode:
for nI := 0 to High(aTableCoordinatesArray) do
begin
aTableCoordinatesArray[nI].TableEndPos := nTableEndPos;
nOffSet := nTableEndPos + Length(tblEndIdentifier); //Offset hinter die letzte gefundene Position setzen
nTableEndPos := PosEx(tblEndIdentifier, cSourceCode, nOffSet); //nach dem nächsten '</table>' schauen. Es wird angenommen, dass cSourceCode korrekt ist und genauso viele EndTags, wie StartTags vorhanden sind.
end;
Vorweg: Der Ansatz war, alle vorkommenden Taellen im Quelltext zu kennen, um zu wissen, wo die Table anfängt und wo sie aufhört (Stichwort: Verschachtelte Tables).
Genau da liegt aber mein Problem, denn der End-Tag von
aTableCoordinatesArray[nI].TableStartPos
ist nicht unbedingt
Delphi-Quellcode:
aTableCoordinatesArray[nI].TableEndPos
Was die Definition des Rückgabewertes betrifft: Das ist nicht das Problem an sich.
Es fällt mir lediglich schwer, zuzuordnen welcher End-Tag zu welchem Start-Tag gehört.
Habe mir schon verschachtelte for-Schleifen überlegt, was allerdings alles nicht hinhaut.
Habt ihr eine Idee? Würdet ihr vom Ansatz her überhaupt so wie ich beginnen?
Vorab vielen Dank für euren Input!