Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML парсинг. Консультация 
:(
    Опции темы
MrRadu
Дата 16.3.2013, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.3.2013
Где: Россия, Москва

Репутация: нет
Всего: нет



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

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

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

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

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

Спасибо за ответы.
(Delphi RAD studio XE2)
PM MAIL ICQ Skype   Вверх
EndErr
Дата 17.3.2013, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.12.2007

Репутация: нет
Всего: нет



Пример.
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;


PM MAIL   Вверх
MrRadu
Дата 17.3.2013, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.3.2013
Где: Россия, Москва

Репутация: нет
Всего: нет



Цитата(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 запроса. 
Буду очень благодарен, если не сложно)
Включу вас в список "Спасибо",в программе, если можно)




PM MAIL ICQ Skype   Вверх
Akella
Дата 18.3.2013, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



PM MAIL   Вверх
EndErr
Дата 18.3.2013, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 9.12.2007

Репутация: нет
Всего: нет



Цитата(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;

PM MAIL   Вверх
MrRadu
Дата 18.3.2013, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 14.3.2013
Где: Россия, Москва

Репутация: нет
Всего: нет



Чтобы не плодить темы.
Немного по другому стал парсить..
 
сам парсерс
Код

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 задать переменную масива. Вернее какого формата?
Поправьте если где-то не прав и ошибся.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0675 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.