После просмотра Delphi extract string between to 2 tags и пробовав код, указанный Андреасом Реджбрандом, я понял, что мне нужна версия, которая не остановится после одного тега - моя цель - написать все значения, которые происходят между двумя строками в нескольких XML-файлах в файле журнала.Запись всех экземпляров строк между двумя другими строками в файл журнала
<screen> xyz </screen> blah blah <screen> abc </screen>
-> давая логфайл с
хуг
аЬс
... и так далее.
Что я пытался было удалить часть текста, прочитанную функцией, так что, когда функция повторяется, она перейдет к следующему экземпляру нужной строки, а затем напишет это в файл журнала, пока не будет match left - логическая функция будет true, и функция может остановиться - ниже слегка измененной функции, основанной на версии в ссылке.
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
Поэтому я создаю форму и назначаю файл журнала.
procedure TTagtextextract0r.FormCreate(Sender: TObject);
begin
Edit2.Text:=(TDirectory.GetCurrentDirectory);
AssignFile(LogFile, 'Wordlist.txt');
ReWrite(LogFile);
CloseFile(Logfile);
end;
Чтобы получить файлы, о которых идет речь, я нажимаю кнопку, которая затем читает их.
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.
Моя проблема заключается в том, что без булева цикла в функции, то приложение пишет только одну строки на файл, а затем останавливается, но с булевым кодом приложение застревает в бесконечном цикле - но я не могу достаточно увидеть, где цикл не заканчивается. Возможно ли, что команда «WriteLn» не может затем вывести результат функции? Если он не может, я не знаю, как получить новую строку для каждого запуска функции - что я делаю неправильно здесь?
Учиться 1) правильно отложить свой код, чтобы вы могли видеть, где начинаются и останавливаются блоки, и 2) научитесь использовать отладчик, чтобы пройти через код, чтобы увидеть, что происходит. В этом случае установите точку останова в 'ListBox2.Items.Add (Файлы [k]);' и выполните код с помощью F8 для выполнения каждой строки. (И подсказка: переместите 'AssignFile' до начала цикла и' CloseFile' до конца цикла. Нет смысла открывать и закрывать его повторно в каждой итерации цикла.) –
Обратите внимание, что вы можете использовать ' PosEx' для продолжения поиска с последней позиции, поэтому избегайте использования 'delete'. – MBo
Использование анализатора xml –