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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2017, 11:53   #1
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию Распарсить Atom

Привет всем, помогите решить задчку:

Есть RSS Atom, структура известна, вопросов не возникает. Использую XMLDocument1

Структура atom:

Код:
<entry>
  <tilte></title>
  <published></published>
  <link rel='replies' href='...'>
  <link rel='replies' href='...'>
  <link rel='edit' href='...'>
  <link rel='alternate' href='...'>
</entry>
Все нужные ноды вытаскиваются без проблем, за исключением <link>
Мне нужен именно <link rel='alternale' href='...'>
А вот как до него добраться? Он берет только первый.
Варианту меня только один, пройтись циклом по всем <link> сравнивать атрибут rel и при нужном выдергивать атрибут 'href'.
Но вот как определить количество <link> внутри узла <entry>?
Или может есть еше какие варианты?
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось arriah; 07.03.2017 в 13:31.
arriah вне форума Ответить с цитированием
Старый 07.03.2017, 12:39   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от arriah Посмотреть сообщение
Но вот как определить количество <link> внутри узла <entry>?
Причем тут link? В цикле вам все элементы в entry надо проходить.
Цитата:
Сообщение от arriah Посмотреть сообщение
Или может есть еше какие варианты?
Взять какую-нибудь библиотеку умеющую например XPath
http://stackoverflow.com/questions/5...d-txmldocument
https://www.google.com/search?q=delphi+xpath
Код:
nodes := SelectNodes('//link[@rel="alternate" and @href]');
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 07.03.2017 в 12:42.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2017, 13:17   #3
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Причем тут link? В цикле вам все элементы в entry надо проходить.
Так я вроде как прохожу всем циклом:

Код:
RootXML:=XMLDocument1.DocumentElement;

 for i:= 0 to RootXML.ChildNodes.Count - 1 do begin
  if RootXML.ChildNodes[i].NodeName='entry' then
  begin
     Memo1.Lines.Add(RootXML.ChildNodes[i].ChildNodes['title'].Text);
     Memo1.Lines.Add(RootXML.ChildNodes[i].ChildNodes['published'].Text);

     //вот здесь надо получить линк
     memo1.Lines.Add(VarToStr(RootXML.ChildNodes[i].ChildNodes['link'].Attributes['href']));
  end;
end;
В таком виде он выдергивает первый <link>
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Старый 07.03.2017, 13:21   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так они ж не на том уровне, не в RootXML.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2017, 13:31   #5
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так они ж не на том уровне, не в RootXML.
То есть RootXML.ChildNodes[i].ChildNodes['link'] != RootXML.<entry>.<link>?

Тогда нифига не понимаю как мне вытащить данные при такой структуре:

Код:
<>мусор<>
<>мусор<>
<>мусор<>
<>мусор<>
<>мусор<>
<entry>
  <tilte></title>
  <published></published>
  <link rel='replies' href='...'>
  <link rel='replies' href='...'>
  <link rel='edit' href='...'>
  <link rel='alternate' href='...'>
</entry>

<entry>
  <tilte></title>
  <published></published>
  <link rel='replies' href='...'>
  <link rel='replies' href='...'>
  <link rel='edit' href='...'>
  <link rel='alternate' href='...'>
</entry>

<entry>
  <tilte></title>
  <published></published>
  <link rel='replies' href='...'>
  <link rel='replies' href='...'>
  <link rel='edit' href='...'>
  <link rel='alternate' href='...'>
</entry>

</feed>
Завидую крокодилам! Они даже ходят лежа!

Последний раз редактировалось arriah; 07.03.2017 в 13:34.
arriah вне форума Ответить с цитированием
Старый 07.03.2017, 13:34   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

ChildNodes['link'] видимо только первый достает, а не все.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2017, 14:03   #7
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
ChildNodes['link'] видимо только первый достает, а не все.
Я вобще что-либо перестал понимать
Вот нашел же себе RSS для изучения структуры атома ССылка http://ussrlife.blogspot.com/feeds/posts/default

Загрузили xml, далее делаю
Код:
showmessage(IntToStr(RootXML.ChildNodes['entry'].ChildNodes.Count));
Ответ 16.

Я так понимаю что узлов <entry> в данном XML файле - 16 штук.
Но я ж не поверил! Загрузил его в нотпад, посчитал - а там ответ 25...
Посчитал ручками - 25, загрузил его через оперу - посчитал - 25..

Я глючу или XMLDocument?
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Старый 07.03.2017, 14:54   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что написали, то и вывело.
Это количество элементов в первом entry.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.03.2017, 15:04   #9
arriah
Пользователь
 
Регистрация: 09.08.2015
Сообщений: 62
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это количество элементов в первом entry.
Это я уже понял. Смутило то что внутри <entry> есть узел <author>
Код:
<author>
 <name></name>
 <email></email>
</author>
и он в узле считается как одна строка

Вобщем в таком виде все заработало как надо:
Код:
 for i:= 0 to RootXML.ChildNodes.Count - 1 do begin
  if RootXML.ChildNodes[i].NodeName='entry' then
  begin
     Memo1.Lines.Add(RootXML.ChildNodes[i].ChildNodes['title'].Text);
     Memo1.Lines.Add(RootXML.ChildNodes[i].ChildNodes['published'].Text);
     for k:=0 to RootXML.ChildNodes[i].ChildNodes.Count-1 do begin
        if VarToStr(RootXML.ChildNodes[i].ChildNodes[k].Attributes['rel'])='alternate' then begin
           Memo1.Lines.Add(RootXML.ChildNodes[i].ChildNodes[k].Attributes['href']);
        end;
     end;
  end;
 end;
Завидую крокодилам! Они даже ходят лежа!
arriah вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распарсить таблицу nibufep Общие вопросы Delphi 39 08.01.2016 04:39
Поддержка delphi 7 на процессорах Intel Atom Z3735D Alexandr17 Общие вопросы Delphi 16 13.02.2015 00:05
распарсить сторку bulldog5293 Общие вопросы Delphi 9 18.02.2011 23:57
Парсинг Atom amdbodia PHP 3 09.02.2011 23:27
Распарсить строку bulldog5293 Работа с сетью в Delphi 7 18.12.2010 19:25