В этой статье хотел просто сказать, а точнее сделать для себя как будем парсить очень легко данные XML. Это делается для проекта VK API в Delphi, так как в каждой, рассмотренной статье по ВК API мы в основном получаем данные в формате XML, так что для удобства мы и сделаем этот небольшой парсинг. Можно сделать в виде функции, в виде просто класса как кому удобно. Ну что приступим. В нашей функции будем указывать только тег, между которым парсить (получать) данные, причем будем указывать его только название без угловых скобок, опять же для нашего же удобства, знаем между каким тегом получить данные — написали его имя и все данные получены. Все это также можно оформить в виде отдельного модуля, чтобы в дальнейшем можно было использовать в своих проектах, где необходим парсинг данных.
Также хотел предложить для проекта VK API парсер в цикле, то есть результатом значений может быть XML, где теги повторяются, то есть массив данных — разных значений. Это тоже для более удобной работы, чтобы нам каждый раз не проходить в цикле и не забирать данные. В принципе здесь ничего сложного нету, в следующей статье я расскажу как сделать тот же самый парсер XML-файлов, только с использованием регулярных выражений, думаю будет работать намного быстрее чем этот, и возможно его тогда будет заменить данным парсером. Но сейчас такой небольшой класс объявил я. Да конечно я создал сперва модуль (File-New-Unit)
type
TParserXML=class
public
function ParsXML(XML,tag:WideString):WideString;
function ParsXMLArr(XML,tag:WideString):TStrings;
end;
Первая функция будет отвечать за парсер только одно тега, то есть укажем между каким тегом получать данные — между этим и получим (если их много, одинаковых, то между первым найденным). Вторая функция получает все найденные данные между тегом, то есть если данных под одним и тем же тегом много, то оно получит их все. Первая функция выглядит у меня так
function TParserXML.ParsXML(XML,tag: WideString): WideString;
begin
Delete(XML,1,pos('<'+tag+'>',XML)+length('<'+tag+'>')-1);
Delete(XML,pos('</'+tag+'>',XML),length(XML));
Result:=XML;
end;
Ну и сама функция для получения массива данных, выглядит у меня следующим образом
function TParserXML.ParsXMLArr(XML, tag: WideString): TStrings;
var
ParsTag:TParserXML;
i:integer;
begin
try
Result:=TStringList.Create;
ParsTag:=TParserXML.Create;
i:=1;
while (i<=length(XML)) do
begin
if pos('<'+tag+'>',XML)<>0 then
begin
Result.Add(ParsTag.ParsXML(XML,tag));
Delete(XML,1,pos('</'+tag+'>',XML));
i:=0;
end;
inc(i);
end;
ParsTag.Free;
finally
end;
end;
Ну использовать для одиночных тегов можно так
logVK:=ParsXML.ParsXML(logVK,'count');
Ну естественно вначале необходимо создать объект класса, а затем уже использовать функции, а использование для получения массива данных можно использовать так
ListBox8.Items:=ParsXML.ParsXMLArr(logVK,'src_big');
Можно также получить данные через запятую, все параметры, передаваемые в данные функции — это сам результат XML-данных и тег без угловых скобок, между которым необходимо парсить данные, данный парсер мы будем использовать в проекте VK API в Delphi.