Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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


Ответ
 
Опции темы
Старый 30.11.2011, 18:03   #1
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию чтение XML

Здравствуйте! Облазил весь интернет но так и не нашёл понятного для меня метода . Пожалуйста помогите вывести в Label3 значение
<cloud> но не из категории <day date="2011-11-29" hour="15">
а к примеру <day date="2011-11-29" hour="21">

вот сам XML

http://xml.weather.co.ua/1.2/forecas...d=yoursite_com

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo4: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    XMLDocument1: TXMLDocument;
    IdHTTP1: TIdHTTP;
     procedure Pogoda(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  s : string;

implementation

{$R *.dfm}
   function Replace(Str, X, Y: string): string;
{Str - строка, в которой будет производиться замена.
 X - подстрока, которая должна быть заменена.
 Y - подстрока, на которую будет произведена заменена}

var
  buf1, buf2, buffer: string;


begin
  buf1 := '';
  buf2 := Str;
  Buffer := Str;

  while Pos(X, buf2) > 0 do
  begin
    buf2 := Copy(buf2, Pos(X, buf2), (Length(buf2) - Pos(X, buf2)) + 1);
    buf1 := Copy(Buffer, 1, Length(Buffer) - Length(buf2)) + Y;
    Delete(buf2, Pos(X, buf2), Length(X));
    Buffer := buf1 + buf2;
  end;

  Replace := Buffer;
end;

  procedure TForm1.Pogoda(Sender: TObject);
  begin
    
    {Вызвать процедуру
       Pogoda(NIL);}
     {Скачиваем XML}
    GetDir(0,s);
    memo2.Text:=Utf8ToAnsi(IdHTTP1.Get('http://xml.weather.co.ua/1.2/forecast/19?dayf=5&userid=yoursite_com'));
    Memo2.Text:=Memo1.Text + Memo2.Text ;
    Memo2.Text:=Replace(Memo2.Text,'<?xml version="1.0" encoding="UTF-8"?>','');
    Memo2.Lines.SaveToFile(s+'\1.xml');
    {открываем XML}
    XMLDocument1.FileName:='1.xml';
    XMLDocument1.Active := true;
    Memo4.Text:=XMLDocument1.xml.Text ;
     Label1.CAPTION :='погода в ' + XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['name'].Text + 'е';
     Label2.CAPTION := XMLDocument1.DocumentElement.ChildNodes['current'].ChildNodes['t'].Text+' °С';
     Label3.CAPTION := XMLDocument1.DocumentElement.ChildNodes['forecast'].ChildNodes['day'].ChildNodes['cloud'].Text+' °С';



     XMLDocument1.Active := false;

   
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   Pogoda(NIL);
end;

end.
Gudzik11 вне форума Ответить с цитированием
Старый 30.11.2011, 19:21   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,061
По умолчанию

Этот код запишет всю нужную инфу в Memo1
Код:
procedure TForm2.Button1Click(Sender: TObject);
var i: Integer;
    xNode1,xNodeDay,xNodeCloud: IXMLNode;
    s: String;
    xOle: OleVariant;
begin
  XMLDocument1.FileName:='e:\19.xml';
  XMLDocument1.Active:=True;
  try
    xNode1:=XMLDocument1.ChildNodes.FindNode('forecast');
    if xNode1=nil then Exit;
    xNode1:=xNode1.ChildNodes.FindNode('forecast');
    if xNode1=nil then Exit;
    for i:=0 to xNode1.ChildNodes.Count-1 do
      if xNode1.ChildNodes.Nodes[i].NodeName='day' then begin
        s:='';
        xNodeDay:=xNode1.ChildNodes.Nodes[i];
        xOle:=xNodeDay.GetAttribute('date');
        if not VarIsNull(xOle) then s:=s+Format(' date=%s',[String(xOle)]);
        xOle:=xNodeDay.GetAttribute('hour');
        if not VarIsNull(xOle) then s:=s+Format(' hour=%s',[String(xOle)]);
        xNodeCloud:=xNodeDay.ChildNodes.FindNode('cloud');
        if xNodeCloud<>nil then s:=s+Format(' cloud=%s',[xNodeCloud.Text]);
        Memo1.Lines.Add(s);
      end;
  finally
    XMLDocument1.Active:=False;
  end;
end;
Зачем методы в интернете искать? Вся информация по работе с компонентом есть в дельфийском хелпе.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.11.2011 в 20:00.
Аватар вне форума Ответить с цитированием
Старый 05.12.2011, 21:25   #3
Gudzik11
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 138
По умолчанию

Подскажите пожалуйста если мне нужно вытащить из

Код HTML:
-<forecast>
  + <day date="2011-12-05" hour="15"></day>
  + <day date="2011-12-05" hour="21"></day>
    <day/>
    <day/>
 </forecast>
значение date
я делаю так

Код:
sPanel22.Caption:= XMLDocument1.DocumentElement.ChildNodes['forecast'].ChildNodes[0].Attributes['date'].Text;
а delphi пишет что я инвалид

подскажите где у меня ошибка
Gudzik11 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение XML Gudzik11 Общие вопросы Delphi 1 29.11.2011 18:50
чтение XML beemoto Общие вопросы Delphi 19 16.10.2011 11:54
Чтение даних с файла xml amator_roma Visual C++ 11 06.06.2011 14:39
чтение из XML файла frankk WPF, UWP, WinRT, XAML 0 09.02.2011 17:42
чтение простейшего XML TaTT DoGG PHP 4 27.08.2009 11:44