Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 12:07   #1
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию Парсинг XML

Не могу сообразить как парсить вот такую структуру
Код:
<iq from="vjud.jabber.snc.ru" to="" id="" type="result">
<item>
<field var="jid">
<value></value>
</field>
<field var="fn">
<value></value>
</field>
<field var="last">
<value/>
</field>
<field var="first">
<value/>
</field>
<field var="middle">
<value/>
</field>
<field var="nick">
<value></value>
</field>
<field var="bday">
<value></value>
</field>
<field var="ctry">
<value></value>
</field>
<field var="locality">
<value></value>
</field>
<field var="email">
<value></value>
</field>
<field var="orgname">
<value/>
</field>
<field var="orgunit">
<value/>
</field>
</item>
</iq>
мне нужно получить содержимое value при условии что field var = jid
пробовал так
Код:
  fset.XMLDocument1.LoadFromXML(XMLMessage);
  fset.XMLDocument1.Active := true;
  if fset.XMLDocument1.DocumentElement.ChildNodes[0].ChildNodes['iq'].Attributes['from'] = 'jud.jabber.ru' then
    if fset.XMLDocument1.DocumentElement.ChildNodes[1].ChildNodes['fields'].Attributes['var'] = 'jid' then
      fset.jids.Items.Add(fset.XMLDocument1.ChildNodes[2].ChildNodes['value'].Text);
    fset.XMLDocument1.Active := false;
Я ваш новый друг, смиритесь!

Последний раз редактировалось [Smarik]; 13.03.2010 в 12:11.
[Smarik] вне форума Ответить с цитированием
Старый 13.03.2010, 12:46   #2
Terikon
Форумчанин
 
Регистрация: 22.02.2009
Сообщений: 174
По умолчанию

т.е. если var="jid" то вытаскивать значения <value> если нет то не вытаскивать? Получиить значения всех <value> ? или только для<field var="jid"> ? Думаю проще будет использовать Pos Copy, или регулярные значения.
Terikon вне форума Ответить с цитированием
Старый 13.03.2010, 12:55   #3
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Нужны value только при условии <field var="jid">
Я ваш новый друг, смиритесь!

Последний раз редактировалось [Smarik]; 13.03.2010 в 13:27.
[Smarik] вне форума Ответить с цитированием
Старый 13.03.2010, 15:51   #4
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Попробовал еще так
Код:
  XMLParser := TGmXML.Create(self);
  XMLParser.Text := XMLMessage;
  XMLItem := XMLParser.Nodes.Root;
  if XmlItem.Params.Values['from'] = fset.transport.Text then
    if XMLItem.Children.NodeByName['field'].Params.Values['var'] = 'jid' then
      fset.Caption:=XMLItem.Children.NodeByName['value'].AsString;
  XMLParser.free;
первое условие проходит нормально, а второе не выполняется...
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 13.03.2010, 16:28   #5
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Ну, тогда можно с помощью костылей:
Код:
uses StrUtils;
begin
  sPos := Pos('var="jid"', Str);
  if sPos > 0 then
  begin
    sPos := PosEx('<value>', Str, sPos) + 7; // Длина <value>
    value := Copy(Str, sPos, PosEx('</value>', Str, sPos) - sPos);
  end;
end;
P.S. Писал на форум, так что могут быть ошибки.
psycho-coder вне форума Ответить с цитированием
Старый 13.03.2010, 17:33   #6
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Ну я пришел к таким же костылям
Код:
_begin := Pos('<value>',_msg) + Length('<value>');
_end := Pos('</value>',_msg);
_result := Copy(_msg, _begin, _end-_begin);
Проблема в том, что в строке надо выловить 30 таких моментов, а ловится только первый, это надо функцией delete удалять то, что уже просмотрели и циклом слать опять читать строку... Но не могу сообразить какие параметры передать в delete чтоб это работало правильно.
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 13.03.2010, 17:38   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от [Smarik] Посмотреть сообщение
Ну я пришел к таким же костылям
Код:
_begin := Pos('<value>',_msg) + Length('<value>');
_end := Pos('</value>',_msg);
_result := Copy(_msg, _begin, _end-_begin);
Проблема в том, что в строке надо выловить 30 таких моментов, а ловится только первый, это надо функцией delete удалять то, что уже просмотрели и циклом слать опять читать строку... Но не могу сообразить какие параметры передать в delete чтоб это работало правильно.
Не нужно ничего удалять))
Код:
uses StrUtils;
begin
while sPos > 0 do
begin
  sPos := PosEx('var="jid"', Str, sPos);
  if sPos > 0 then
  begin
    sPos := PosEx('<value>', Str, sPos) + 7; // Длина <value>
    value := Copy(Str, sPos, PosEx('</value>', Str, sPos) - sPos);
  end;
end;
end;
psycho-coder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсер XML, не видит XML тэги supercelt PHP 3 02.11.2009 19:18
XML (парсинг MSXML2_TLB.pas) и Delphi 2009 S_Yevgeniy Помощь студентам 0 17.09.2009 18:22
XML (парсинг NativeXml ) и Delphi 2009 S_Yevgeniy Помощь студентам 13 17.09.2009 15:56
Парсинг сайта AnToHa-KiLL Общие вопросы Delphi 3 30.06.2009 08:22
Парсинг строки beemoto Общие вопросы Delphi 18 12.04.2009 18:52