![]() |
|
|
#1
|
|||
|
|||
|
Как с помощью Copy и Pos парсить html? Не могли бы привести пример?
Немного о задумке: Хочу написать клиент для сайта, который будет проверять и выводить информацию. Программа обращается к PHP скрипту на сервере и получать страницу-ответ (с серверной частью и получением страницы проблем нет). Сначало хотел выдавать ответ в XML разметке, но работать с ним геморойно. Зачем нашел JSON, но в библиотеке для работы с ним на делфи не разобрался . Решил использовать свой велосипед на основе HTML. Разметка приблизительно такая:Код:
<count>3</count> <info0title>Заголовок0</info0title> <info0text>Текст0</info0text> <info1title>Заголовок1</info1title> <info1text>Текст1</info1text> <info2title>Заголовок2</info2title> <info2text>Текст2</info2text> |
|
#2
|
||||
|
||||
|
в принципе да, copy и pos вполне хватит...где-то у меня еще валялись готовые процедуры для парсинга..найду выложу
|
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
|||
|
|||
|
Код:
s:=copy(s,ansipos('>',s)+1,length(s));
s:=copy(s,0,ansipos('<',s)); |
|
#5
|
|||
|
|||
|
Цитата:
aleksnine, не совсем понял код... если надо получить текст между <mytag>Текст, который нужно получить</mytag> то как ее записывать (получается толку от первой строки нет, вторая ее перекроет )? |
|
#6
|
||||
|
||||
|
Код:
s:='<count>3</count>';
if (pos('<count>',s)<>0)and(pos('</count>',s)<>0 ) then
begin
g:=inttostr(copy(s,pos('<count>',s),pos('</count>',s)-pos('<count>',s)));
end;Чтото наподобе такого. код не проверял делал как говорится на коленке. |
|
#7
|
||||
|
||||
|
Забавная задачка, давно такой небыло. Вот такая забавка получилась:
Код:
TSection = record
Name, Value: String;
end;
TSectionArray = Array of TSection;
TCustomParser = class
fText: String;
fSections: TSectionArray;
private
procedure SetText(const Value: String);
function GetSectionCount: Integer;
public
property Text: String read fText write SetText;
property Count: Integer read GetSectionCount;
property Sections: TSectionArray read fSections write fSections;
function GetSectionValue(Section: String): String;
end;
{ TCustomParser }
function TCustomParser.GetSectionCount: Integer;
begin
Result := Length(fSections);
end;
function TCustomParser.GetSectionValue(Section: String): String;
Var i: Integer;
begin
for i := 0 to Length(fSections) - 1
do if fSections[i].Name = Section
then begin
Result := fSections[i].Value;
Break;
end;
end;
procedure TCustomParser.SetText(const Value: String);
Var S: String;
begin
fText := Value;
S := Value;
SetLength(fSections, 0);
while Pos('<', S) > 0
do begin
SetLength(fSections, Length(fSections) + 1);
Delete(S, 1, Pos('<', S));
fSections[High(fSections)].Name := Copy(S, 1, Pos('>', S) - 1);
Delete(S, 1, Pos('>', S));
fSections[High(fSections)].Value := Copy(S, 1, Pos('</', S) - 1);
Delete(S, 1, Pos('>', S));
end;
end;Последний раз редактировалось Страдалецъ, 27.08.2010 в 00:59. |
|
#8
|
|||
|
|||
|
Цитата:
[DCC Error] Unit1.pas(37): E2010 Incompatible types: 'HWND' and 'string' |
|
#9
|
||||
|
||||
|
Ругается на типы переменных. У вас какого типа переменные s и g?
И вы пробовали мой вариант? |
|
#10
|
||||
|
||||
|
Ticksy попробуй сначала вариант страдальце у него больше опыта.
|
|
#11
|
|||
|
|||
|
Цитата:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var s : String;
var g : string;
begin
s:='<count>3</count>';
if (pos('<count>',s)<>0)and(pos('</count>',s)<>0 ) then
begin
g:=inttostr(copy(s,pos('<count>',s),pos('</count>',s)-pos('<count>',s)));
Edit1.Text := g;
end;
end;Среда: Delphi 2010 Если убрать функцию IntToStr, то в g пишется '<count>3' (без кавычек). |
|
#12
|
||||
|
||||
|
щас подредактирую
PHP код:
Последний раз редактировалось Bars1992, 01.09.2010 в 22:05. |
|
#13
|
|||
|
|||
|
Bars1992, спасибо! твой код работает
![]() |