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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсинг RSS, Загвоздка. 
V
    Опции темы
Alkash
Дата 15.6.2009, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Доброго времени суток господа. Возникла необходимость пропарсить RSS файл, соответственно избрал для этой цели TXMLDocument.
Реализовал следующим образом - 
Код

With RssDoc.DocumentElement.ChildNodes['channel'] do begin
   if not (childnodes.findnode('title')=nil) then
   TreeView1.Items.Add(nil, ChildNodes.Nodes['title'].NodeValue);
   if not (childnodes.findnode('link')=nil) then
    TreeView1.Items.AddChild(TreeView1.Items.Item[i], ChildNodes.Nodes['link'].nodevalue);
   if not (childnodes.findnode('copyright')=nil) then
   TreeView1.Items.AddChild(TreeView1.Items.Item[i],ChildNodes.Nodes['copyright'].nodevalue)
   else TreeView1.Items.AddChild(TreeView1.Items.Item[i],'N/A');
   if not (childnodes.findnode('lastBuildDate')=nil) then
    TreeView1.Items.AddChild(TreeView1.Items.Item[i],ChildNodes.Nodes['lastBuildDate'].nodevalue);
   if not (childnodes.findnode('item')=nil) then
    begin
     for I := 0 to ChildNodes.count - 1 do
      if not (ChildNodes.Nodes[i].ChildNodes['title']=nil) then
      TreeView1.Items.Add(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['title'].NodeValue)
      else TreeView1.Items.Add(TreeView1.Items.Item[i], 'N\A');
      if not (ChildNodes.Nodes[i].ChildNodes['link']=nil) then
     TreeView1.Items.AddChild(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['link'].NodeValue)
      else TreeView1.Items.AddChild(TreeView1.Items.Item[i],'N\A');
      if not (ChildNodes.Nodes[i].ChildNodes['description']=nil) then
      TreeView1.Items.AddChild(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['description'].NodeValue)
      else TreeView1.Items.AddChild(TreeView1.Items.Item[i],'N\A');
      if not (ChildNodes.Nodes[i].ChildNodes['pubDate']=nil) then
      TreeView1.Items.AddChild(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['pubDate'].NodeValue)
      else TreeView1.Items.AddChild(TreeView1.Items.Item[i], 'N\A');
      i := i+1;
    end;


Первая часть работает просто супер, а вот вторая - в строке : TreeView1.Items.Add(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['title'].NodeValue)

выдаёт EVariantTypeCastError: Could not convert variant type "Null" into type "String".

При этом в файле - все теги присутствуют. В чём может заключаться проблема?

Пример файла
Код

<?xml version="1.0" encoding="windows-1251"?>
<rss xmlns:yandex="http://news.yandex.ru" version="2.0">
  <channel>
    <title>Текст</title>
    <link xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:lego="https://lego.yandex-team.ru">http://news.yandex.ru/Russia/index.html</link>
    <description xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:lego="https://lego.yandex-team.ru">Первая в России служба автоматической обработки и систематизации новостей. Сообщения ведущих российских и мировых СМИ. Обновление в режиме реального времени 24 часа в сутки.</description>
    <image xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:lego="https://lego.yandex-team.ru">
      <url>*****</url>
      <link>******</link>
      <title>Текст</title>
    </image>
    <lastBuildDate>Thu, 28 May 2009 18:58:40 +0400</lastBuildDate>

<item>
      <title>Текст</title>
      <link>http://</link>
      <description>очень много текста</description>
      <pubDate>Thu, 28 May 2009 17:08:00 +0400</pubDate>
      <guid>Ничего не значащая лабуда, пропускаем</guid>
    </item>


Это сообщение отредактировал(а) Alkash - 15.6.2009, 15:48


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
pseud
Дата 15.6.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Код

...
      if not (ChildNodes.Nodes[i].ChildNodes['title']=nil) then
        TreeView1.Items.Add(TreeView1.Items.Item[i],ChildNodes.Nodes[i].ChildNodes['title'].NodeValue)
      else 
        TreeView1.Items.Add(TreeView1.Items.Item[i], 'N\A');
...

у тебя видимо ..['title'].NodeValue == NULL
измени подход на что-то типа:
Код

var
  node: IXMLNode;
  v: Variant;
  s: string;
begin
...
  node := ChildNodes.Nodes[i].ChildNodes['title'];
  if node <> nil then
  begin
    v := node.NodeValue;
    if v <> NULL then
      s := v
    else
      s := '';
  end else
    s := 'N\A';
  with TreeView1.Items do Add(Item[i], s);
...




--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alkash
Дата 15.6.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



В результате - выдаёт вообще что все элементы пусты. Но ошибок не возникает


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
pseud
Дата 15.6.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Цитата(Alkash @  15.6.2009,  16:55 Найти цитируемый пост)
В результате - выдаёт вообще что все элементы пусты. Но ошибок не возникает

выложи толковый пример xml (для опытов)
и что ты хочешь увидеть?



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alkash
Дата 15.6.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Вот файл для опытов. Хочу его разобрать на элементы, по этим элементам построить дерево со значениями элементов в узлах.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  test.rar 3,22 Kb


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
pseud
Дата 15.6.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



вот, что удалось по-быстрому:
- на форме TreeView1, XMLDocument1, Button1
- код нажатия кнопки
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  xNode: IXMLNode;

  procedure FillNode(AXMLNode: IXMLNode; ATreeNode: TTreeNode; AFillSelf: Boolean = True);
  var
    i: Integer;
    v: Variant;
    s: string;
    n: TTreeNode;
  begin
    n := ATreeNode;
    if AFillSelf then
    begin
      s := '';
      if AXMLNode.NodeType = ntText then
      begin
        v := AXMLNode.NodeValue;
        if v <> NULL then
          s := v;
      end else
        s := AXMLNode.LocalName;
      with TreeView1.Items do
        n := AddChild(n, s);
    end;
    if AXMLNode.HasChildNodes then
      for i := 0 to AXMLNode.ChildNodes.Count - 1 do
        FillNode(AXMLNode.ChildNodes[i], n);
  end;
begin
  TreeView1.Items.Clear;

  XMLDocument1.Active := False;
  XMLDocument1.LoadFromFile('test.xml');
  XMLDocument1.Active := True;

  xNode := XMLDocument1.DocumentElement.ChildNodes['channel'];

  FillNode(xNode, nil, False);
end;


Добавлено через 1 минуту и 23 секунды
даже так ))
Код

  xNode := XMLDocument1.DocumentElement;



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alkash
Дата 15.6.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Спасибо огромное!


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
pseud
Дата 16.6.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

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



Цитата(Alkash @  15.6.2009,  18:40 Найти цитируемый пост)
Ещё раз спасибо вам за помощь, но возник всё же вопрос по вашему примеру. В нём - в дереве - пишутся сами теги, а каким образом эти теги заменить на свой текст? Заранее благодарен. Просто не совсем ещё разобрался

Я ж сказал "вот, что удалось по-быстрому".
Этот парсинг применим к любому xml-файлу.
В твоем случае, видимо, все таки надо завязываться за конкретные теги, чтобы давать свои имена aka наименование или адрес.
Главное - я тебе показал, что до всех узлов твоего файла реально добраться и без варнингов вычитать.
Модифицируй код. Уходи от универсальности к именам веток. Будут вопросы - задавай.


--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
Alkash
Дата 16.6.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


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

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



Уже разобрался) Спасибо ещё раз)


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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