Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > XML парсинг. Консультация


Автор: MrRadu 16.3.2013, 23:45
Сейчас модно писать приложение API, особенно к крупной соц. сети vk
Знаю как работает.. но не знаю как правильно.
Хочу спросить.. Чтобы не идти через горы.. а найти правильную дорогу.

Сервер отправляет мне ответ, на мой Get запрос. 
В формате XML

данные хочу вытащить, при помощи XMLDocument

Такой вопрос, вот нам прислали ответ. Мы его должны записать xml file, чтобы потом прочитать и вытащить, что нам нужно?
Или же можно сразу, получив данные, обработать их, и присовить нашим значениям. 

паралельно гуглю и ищу инфу. Но везде свои примеры и не всегда есть, то что мне нужно.

Спасибо за ответы.
(Delphi RAD studio XE2)

Автор: EndErr 17.3.2013, 15:54
Пример.
Item - это нод xml который ищем.
Title - один элемент этого Item-a.
Код

uses xmldom, XMLIntf, XMLDoc;
...

procedure grabData(url: String);
var
   xmlDoc: IXMLDocument;
   ANode : IXMLNode;
begin
  xmlDoc := TXMLDocument.Create(nil) ;
  try
    xmlDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
    try
      xmlDoc.LoadFromFile(url);
      xmlDoc.Active := true; //validate
      ANode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');;
      while ANode <> nil do
      begin
          if ANode.ChildNodes['title'] <> nil then
            Params.ParamByName('title').AsWideString := ANode.ChildNodes['title'].Text;
          dm.qArticles.Execute;
        ANode := ANode.NextSibling;
      end;
    except
      on EX : EDOMParseError do
        raise Exception.Create('Invalid XML: ' + Ex.Message) ;
    end;
  finally
    if Assigned(ANode) then
      ANode := nil;
    xmlDoc := nil;
  end;
end;


Автор: MrRadu 17.3.2013, 21:19
Цитата(EndErr @ 17.3.2013,  15:54)
Пример.
Item - это нод xml который ищем.
Title - один элемент этого Item-a.
Код

uses xmldom, XMLIntf, XMLDoc;
...

procedure grabData(url: String);
var
   xmlDoc: IXMLDocument;
   ANode : IXMLNode;
begin
  xmlDoc := TXMLDocument.Create(nil) ;
  try
    xmlDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
    try
      xmlDoc.LoadFromFile(url);
      xmlDoc.Active := true; //validate
      ANode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');;
      while ANode <> nil do
      begin
          if ANode.ChildNodes['title'] <> nil then
            Params.ParamByName('title').AsWideString := ANode.ChildNodes['title'].Text;
          dm.qArticles.Execute;
        ANode := ANode.NextSibling;
      end;
    except
      on EX : EDOMParseError do
        raise Exception.Create('Invalid XML: ' + Ex.Message) ;
    end;
  finally
    if Assigned(ANode) then
      ANode := nil;
    xmlDoc := nil;
  end;
end;


Спасибо.
А можете пример привести 
я получаю вот такой ответ

<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <audio>
  <aid>195209618</aid>
  <owner_id>20358746</owner_id>
  <artist>Dze ft. GidroGramm (undermold)</artist>
  <title>Горе от ума</title>
  <duration>180</duration>
  <url>URL</url>
 </audio>

 <audio>
  <aid>195777548</aid>
  <owner_id>20358256</owner_id>
  <artist>Dze ft. GidroGramm (undermold)</artist>
  <title>title</title>
  <duration>180</duration>
  <url>URL</url>
 </audio>

</response>

Это ответ Get запроса. 
Буду очень благодарен, если не сложно)
Включу вас в список "Спасибо",в программе, если можно)




Автор: Akella 18.3.2013, 11:33
http://www.delphiexpert.ru/view_lesson.php?id=97

Автор: EndErr 18.3.2013, 17:17
Цитата(MrRadu @ 17.3.2013,  21:19)
Цитата(EndErr @ 17.3.2013,  15:54)
Пример.
Item - это нод xml который ищем.
Title - один элемент этого Item-a.
Код

uses xmldom, XMLIntf, XMLDoc;
...

procedure grabData(url: String);
var
   xmlDoc: IXMLDocument;
   ANode : IXMLNode;
begin
  xmlDoc := TXMLDocument.Create(nil) ;
  try
    xmlDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
    try
      xmlDoc.LoadFromFile(url);
      xmlDoc.Active := true; //validate
      ANode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('item');;
      while ANode <> nil do
      begin
          if ANode.ChildNodes['title'] <> nil then
            Params.ParamByName('title').AsWideString := ANode.ChildNodes['title'].Text;
          dm.qArticles.Execute;
        ANode := ANode.NextSibling;
      end;
    except
      on EX : EDOMParseError do
        raise Exception.Create('Invalid XML: ' + Ex.Message) ;
    end;
  finally
    if Assigned(ANode) then
      ANode := nil;
    xmlDoc := nil;
  end;
end;


Спасибо.
А можете пример привести 
я получаю вот такой ответ

<?xml version="1.0" encoding="utf-8"?>
<response list="true">
 <audio>
  <aid>195209618</aid>
  <owner_id>20358746</owner_id>
  <artist>Dze ft. GidroGramm (undermold)</artist>
  <title>Горе от ума</title>
  <duration>180</duration>
  <url>URL</url>
 </audio>

 <audio>
  <aid>195777548</aid>
  <owner_id>20358256</owner_id>
  <artist>Dze ft. GidroGramm (undermold)</artist>
  <title>title</title>
  <duration>180</duration>
  <url>URL</url>
 </audio>

</response>

Это ответ Get запроса. 
Буду очень благодарен, если не сложно)
Включу вас в список "Спасибо",в программе, если можно)

Какой ответ надо получить? 

примерно будет так, только надо определить переменные и уже использовать их.

Код

procedure grabData(url: String);
var
   xmlDoc: IXMLDocument;
   ANode : IXMLNode;
begin
  xmlDoc := TXMLDocument.Create(nil) ;
  try
    xmlDoc.ParseOptions := [poResolveExternals, poValidateOnParse];
    try
      xmlDoc.LoadFromFile(url);
      xmlDoc.Active := true;
      ANode := XMLDoc.DocumentElement.ChildNodes.First.ChildNodes.FindNode('audio');
      while ANode <> nil do
      begin
          if ANode.ChildNodes['aid'] <> nil then
            aid := ANode.ChildNodes['aid'].Text;
          if ANode.ChildNodes['owner_id'] <> nil then
            owner_id := ANode.ChildNodes['owner_id'].Text;
          if ANode.ChildNodes['artist'] <> nil then
            artist := ANode.ChildNodes['artist'].Text;
          if ANode.ChildNodes['title'] <> nil then
            title := ANode.ChildNodes['title'].Text;
          if ANode.ChildNodes['duration'] <> nil then
            duration := ANode.ChildNodes['duration'].Text;
          if ANode.ChildNodes['url'] <> nil then
            url := ANode.ChildNodes['url'].Text;
        ANode := ANode.NextSibling;
      end;
    except
      on EX : EDOMParseError do
        raise Exception.Create('Invalid XML: ' + Ex.Message) ;
    end;
  finally
    if Assigned(ANode) then
      ANode := nil;
    xmlDoc := nil;
  end;
end;

Автор: MrRadu 18.3.2013, 22:51
Чтобы не плодить темы.
Немного по другому стал парсить..
 
сам парсерс
Код

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;

У нас на выходе, мы получаем значения типа TStringList

Если выводить значение в ListBox, то понятное дело,выведит.

А я хочу реализовать так.
имеем перменные AUDIO_TITLE, AUDIO_ARTIST, AUDIO_URL
1. Создать массив, чтобы записывать AUDIO_TITLE[i] AUDIO_ARTIST[i],AUDIO_URL[i];

2. А затем выводим в ListBox  AUDI_TITLE[i], AUDIO_ARTIST[i] 
ну и при нажатии на кнопку, в зависимости от чего равен i, тот URL  у нас и пойдет...

Какова типа должны быть наши переменнные? и как правильно зпаисывать их.

Сейчас я их вытаскиваю так
Код

 Form1.ListBox1.Items:=url.ParsXMLArr(XML_URL,'url'); 

Как вместо ListBox1.Item задать переменную масива. Вернее какого формата?
Поправьте если где-то не прав и ошибся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)