Nachdem ich Delphi extract string between to 2 tags angesehen und den dort angegebenen Code von Andreas Rejbrand ausprobiert hatte, erkannte ich, dass ich eine Version brauchte, die nach einem Tag nicht aufhört - mein Ziel ist es, alle zu schreiben Werte, die zwischen zwei Zeichenfolgen in mehreren XML-Dateien in einer Protokolldatei auftreten.Alle Zeichenfolgen zwischen zwei anderen Zeichenketten in Logfile schreiben
<screen> xyz </screen> blah blah <screen> abc </screen>
-> gibt ein Logfile mit
xyz
abc
... und so weiter.
Was ich versuchte war, einen Teil des von der Funktion gelesenen Textes zu löschen, so dass, wenn die Funktion wiederholt wurde, es zur nächsten Instanz der gewünschten Zeichenfolge gehen würde und diese auch in die Protokolldatei schreiben würde, bis es keine gab Übereinstimmungen links - die boolesche Funktion wäre wahr und die Funktion könnte anhalten - unterhalb der leicht modifizierten Funktion, basierend auf der Version in der Verbindung.
function ExtractText(const Tag, Text: string): string;
var
StartPos1, StartPos2, EndPos: integer;
i: Integer;
mytext : string;
bFinished : bool;
begin
bFinished := false;
mytext := text;
result := '';
while not bFinished do
begin
StartPos1 := Pos('<' + Tag, mytext);
if StartPos1 = 0 then bFinished := true;
EndPos := Pos('</' + Tag + '>', mytext);
StartPos2 := 0;
for i := StartPos1 + length(Tag) + 1 to EndPos do
if mytext[i] = '>' then
begin
StartPos2 := i + 1;
break;
end;
if (StartPos2 > 0) and (EndPos > StartPos2) then
begin
result := result + Copy(mytext, StartPos2, EndPos - StartPos2);
delete (mytext, StartPos1, 1);
end
Also ich das Formular erstellen und eine Protokolldatei zuweisen.
procedure TTagtextextract0r.FormCreate(Sender: TObject);
begin
Edit2.Text:=(TDirectory.GetCurrentDirectory);
AssignFile(LogFile, 'Wordlist.txt');
ReWrite(LogFile);
CloseFile(Logfile);
end;
Um dann die fraglichen Dateien zu bekommen, klicke ich auf eine Schaltfläche, die sie dann liest.
procedure TTagtextextract0r.Button3Click(Sender: TObject);
begin
try
sD := TDirectory.GetCurrentDirectory;
Files:= TDirectory.GetFiles(sD, '*.xml');
except
exit
end;
j:=Length(Files);
for k := 0 to j-1 do
begin
Listbox2.Items.Add(Files[k]);
sA:= TFile.ReadAllText(Files[k]);
iL:= Length(sA);
AssignFile(LogFile, 'Wordlist.txt');
Append(LogFile);
WriteLn(LogFile, (ExtractText('screen', sA)));
CloseFile (LogFile);
end;
end;
end.
Mein Problem ist, dass es ohne die boolean-Schleife in der Funktion, nur die Anwendung die eine Zeile pro Datei schreibt und stoppt dann aber mit dem boolean Code der Anwendung in einer Endlosschleife hängen bleibt - aber ich kann nicht Sehen Sie, wo die Schleife nicht endet. Ist es möglich, dass der Befehl "WriteLn" das Ergebnis der Funktion nicht ausgeben kann? Wenn es nicht möglich ist, weiß ich nicht, wie man für jeden Lauf der Funktion eine neue Zeile bekommt - was mache ich hier falsch?
Lernen Sie, 1) Ihren Code richtig einzurücken, damit Sie sehen können, wo Blöcke beginnen und stoppen, und 2) lernen, den Debugger zu benutzen, um den Code zu durchlaufen, um zu sehen, was passiert. Setzen Sie in diesem Fall einen Haltepunkt bei 'ListBox2.Items.Add (Files [k]);' und durchlaufen Sie den Code mit F8, um jede Zeile auszuführen. (Und ein Hinweis: Verschieben Sie 'AssignFile' vor den Loop-Start und' CloseFile' nach dem Loop-Ende. Es hat keinen Sinn, es in jeder Iteration der Schleife wiederholt zu öffnen und zu schließen.) –
Beachten Sie, dass Sie ' PosEx' Funktion, um die Suche von der letzten Position fortzusetzen, so dass die Verwendung von 'delete' vermieden wird. – MBo
Verwenden Sie einen XML-Parser –