Delphi extract string between to 2 tags을보고 Andreas Rejbrand가 제공 한 코드를 시도한 후에 하나의 태그 뒤에 멈추지 않는 버전이 필요하다는 것을 깨달았습니다. 여러 .xml 파일의 두 문자열 사이에서 발생하는 값을 로그 파일에 저장합니다.다른 두 문자열 사이에 문자열의 모든 인스턴스를 로그 파일로 작성
<screen> xyz </screen> blah blah <screen> abc </screen>
-> 등등
XYZ
ABC
... 그리고있는 로그 파일을 제공합니다.
필자가 시도한 것은 함수에서 읽은 텍스트의 일부를 삭제하여 함수가 반복 될 때 원하는 문자열의 다음 인스턴스로 이동 한 다음 로그 파일에 그 문자열이 없을 때까지 기록하는 것이 었습니다 왼쪽 일치 - 부울 함수가 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 (Files [k]);'에 중단 점을 설정하고 F8 키를 사용하여 각 행을 실행하십시오. (그리고 힌트 :'AssignFile'을 루프 시작 전에 움직이고'CloseFile'을 루프 끝단 다음으로 이동하십시오. 루프의 반복마다 반복해서 열고 닫을 필요가 없습니다.) –
' PosEx' 함수는 마지막 위치에서 검색을 계속하기 때문에'delete' 사용법을 피하십시오. – MBo
xml 파서 사용 –