Вопрос Получить значение строки в текстовом файле

nik1967

Old Men
Проверенный
Здравствуйте, господа! Что-то у меня переклинило, и я никак не соображу.
Суть вопроса такова:
Имеется файл .xml, но это не правильный файл .xml. Если бы он был правильный, то я бы воспользовался скриптами от Shegorat'а для работы с XML файлами.
Примерная структура файла:
Код:
<1>
  <2
    a="a2"
    b="b2"
    c="c2"
    >
    <3
      d="d3"
      e="e3"
     >
     </3>
  </2>
</1>
Так, что можно рассматривать данный файл, как текстовый файл.
Так вот, как мне получить значение d= и e= ? То есть "d3" и "e3" соответственно.
Значение строковое. Значения секций не важно.
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
Код:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
function GetValue(strFilename, keyFind: String): string;
var
   i, vPos: Integer;
   strArr: TArrayOfString;
begin
   Result := '';
   LoadStringsFromFile(strFilename, strArr);

   for i := 0 to GetArrayLength(strArr) - 1 do
   begin
      if (Pos(keyFind, strArr[i]) > 0) then
      begin
         vPos := Pos(keyFind, strArr[i]);
         Delete(strArr[i], 1, vPos + Length(keyFind) - 1);
         Result := strArr[i];
      end;
   end;
end;

procedure InitializeWizard;
begin
   MsgBox(GetValue(ExpandConstant('{src}\1.xml'), 'd='), mbInformation, MB_OK);

   //показать без ковычек
   MsgBox(RemoveQuotes(GetValue(ExpandConstant('{src}\1.xml'), 'e=')), mbInformation, MB_OK);
end;
 
Последнее редактирование:

nik1967

Old Men
Проверенный
Mailchik, благодарю! Правда, я, немного подумав, реализовал по другому (написал сообщение утром перед работой, на работе подумал, написал, а потом уже твоё сообщение прочитал, когда получил доступ к интернету)
Код:
function GetValue(FilePath,TextSearch: string; var value: string): string;
var
   i: Integer;
   ss: TArrayOfString;
begin
   LoadStringsFromFile(FilePath, ss);
   for i:=0 to GetArrayLength(ss)-1 do begin
     if Pos(TextSearch, ss[i])>0 then begin
         value:= Copy(ss[i],Pos('"',ss[i]),Length(ss[i]));
       Result:= value;
     end;
   end;
end;
Теперь вот ещё что. Что твой, что мой скрипт позволяет получить нужное значение, если только строка после него пустая. Возникла необходимость получить значение переменных a и b (a1 и b1) из строки подобного типа:
Код:
<1 a="a1" b="b1" 2="2a" 3="3a"> </1>
Причём величина (длина) a1 и b1 может быть разной.

Отбой. Сам додумался.
Код:
function GetValue(strFilename,keyFind: string; var tvalue: string): string;
var
  i,vPos: Integer;
  strArr: TArrayOfString;
begin
  LoadStringsFromFile(strFilename, strArr);
  for i:= 0 to GetArrayLength(strArr)-1 do begin
  if Pos(keyFind,strArr[i])>0 then begin
    vPos:= Pos(keyFind,strArr[i]);
      Delete(strArr[i],1,vPos+Length(keyFind)-1);
        Delete(strArr[i],Pos(' ',strArr[i]),Length(strArr[i]));
        tvalue:= strArr[i];
      Result:= tvalue;
    end;
  end;
end;
 
Последнее редактирование:

Snoopak96

Старожил
nik1967,
Код:
function Find(const S, P: string): Integer;
var
  i, j: Integer;
begin
  Result := 0;
  if Length(P) > Length(S) then
  Exit;
  for i := 1 to Length(S) - Length(P) + 1 do
  for j := 1 to Length(P) do
  if P[j] <> S[i + j - 1] then
  Break
  else if j = Length(P) then
  begin
  Result := i;
  Exit;
  end;
end;

function SearchValues(file,sValue,eValue:string): string;
var
  ss: TArrayOfString;
  s,t: String;
  i,k,j,int,qu: Integer;
begin
  LoadStringsFromFile(file, ss);
  s:= '';
  for i:=0 to GetArrayLength(ss)-1 do begin
  if Pos(sValue, ss[i])>0 then begin
  s:= ss[i];
  int:=Pos(sValue, s)+Length(sValue);
  Delete(s,1,int);
  qu:= Find(s,eValue);  
  Delete(s,qu,Length(s));  
  Result := s;
  Exit;
  end;
  end;
end;

procedure InitializeWizard;
begin
MsgBox(SearchValues(ExpandConstant('{src}\1.xml'),'d=','"'), mbInformation, MB_OK);
end;
 

nik1967

Old Men
Проверенный
Snoopak96, спасибо! А "пробел в кавычках" это где? "d 1" - так?
 
Сверху