Логин:     Забыли пароль?
 
Пароль:   Регистрация

Форум / Программирование - чтение XML  

чтение XML


Страницы: «1» «2»
Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #1] ? 30 ноября 2011, 17:18
Здравствуйте! Облазил весь интернет но так и не нашёл понятного для меня метода . Пожалуйста помогите вывести в Label3 значение
<cloud> но не из категории <day date="2011-11-29" hour="15">
а к примеру <day date="2011-11-29" hour="21">

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.

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #2] 30 ноября 2011, 18:09
А использовать TXMLDocument обязательно? Я давно юзаю XML, но этим компонентом ни разу не пользовался, ибо есть вещь получше.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #3] 30 ноября 2011, 20:02
можно и xml если он на delphi 7 станет .
А где скачять его и как пользоваться?

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #4] 30 ноября 2011, 20:44

Цитата (Gudzik11):

А где скачять его и как пользоваться?

TECXMLParser, в гугле найдёшь. С ним примеры.

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #5] 30 ноября 2011, 21:57
спасибо буду пробовать

Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #6] 1 декабря 2011, 13:24
Поставил ECXMLParser а как работать с ним не могу разобраться нашёл

procedure TForm1.Button2Click(Sender: TObject);
 
procedure DrawXMLItem(XMLItem: TXMLItem);
var
I : Integer;
begin
Memo1.Lines.Add(XMLItem.Name+’ : ‘+XMLItem.Text);
for i := 0 to XMLItem.SubItemCount-1 do
DrawXMLItem(XMLItem.SubItems);
end;
 
begin
XML.LoadFromFile(’E:\file.xml); //любой xml файл, для тестирования можно и здесь указать
Memo1.Lines.BeginUpdate;
DrawXMLItem(XML.Root);
Memo1.Lines.EndUpdate;
end;

а как вытаскивать теперь значения к примеру в label
Может напишешь мне какой нибудь примерчик небольшой ?

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #7] 1 декабря 2011, 13:45
Давай я тебе лучше модуль самодельный дам по работе с этим компонентом. А то у меня примеры уж больно все громоздкие, а писать что-то попроще времени нету. Вот, к примеру:
procedure TClocker.LoadFromFile(const FileName: string);
var
  Parser: TECXMLParser;
  Temp: TXmlItem;
  Index: Integer;
  EventOption: TEventOption;
begin
  // Загрузка из XML
  if not FileExists(FileName)
    then Exit;
 
  Parser:= TECXMLParser.Create(nil);
  try
    // Загрузка файла
    try
      Parser.LoadFromFile(FileName);
      Index:= 0;
    except
      Index:= 1; // как флаг ошибки загрузки
      Application.MessageBox(PChar('Не могу загрузиться из файла ' + FileName + '.'),
                             PChar('Ошибка'),
                             MB_OK + MB_ICONERROR);
    end;
 
    if Index = 0 // если нету ошибки...
      then begin
             // Загрузка параметров дней недели
             Temp:= Parser.Root.NamedItem['Week'];
             for Index:= 0 to FDayOptions.Count - 1 do
               TDayOfWeekOption(FDayOptions[Index]).LoadFromXML(Temp);
 
             // Загрузка параметров главной формы
             Temp:= Parser.Root.NamedItem['MainWindow'];
             FMainFormSettings.LoadFromXML(Temp);
 
             // Загрузка параметров цветов
             Temp:= Parser.Root.NamedItem['Colors'];
             for Index:= 0 to Self.ColorOptionsCount - 1 do
               ColorOptionsByIndex[Index].LoadFromXML(Temp);
 
             // Загрузка параметров событий
             Temp:= Parser.Root.NamedItem['Events'];
             FSpeakEveryHour:= XmlGetBoolParam(Temp, 'SpeakEveryHour', FSpeakEveryHour);
             FSpeakEveryHalfHour:= XmlGetBoolParam(Temp, 'SpeakEveryHalfHour', FSpeakEveryHalfHour);
 
             for Index:= 0 to Temp.Count - 1 do
               begin
                 EventOption:= TEventOption.Create('', '');
                 EventOption.LoadFromXML(Temp[Index]);
                 FEventOptions.Add(EventOption); // Добавляю в список
               end;
 
             // Загрузка звуков юзера
             Temp:= Parser.Root.NamedItem['UserSounds'];
             FUserSounds.Clear();
 
             for Index:= 0 to Temp.Count - 1 do
               FUserSounds.Add(XmlGetStringParam(Temp[Index], 'FileName', ''));
 
             // Загрузка прочих параметров
             FStayOnTop:= XmlGetBoolParam(Parser.Root, 'StayOnTop', FStayOnTop);
             FShowHints:= XmlGetBoolParam(Parser.Root, 'ShowHints', FShowHints);
           end;
  finally
    Parser.Free();
  end;
end;

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #8] 2 декабря 2011, 09:50
а можешь на почту скинуть Gudzik11@ukr.net
а то в ECXMLParser хелпа нет

min@y™
min@y™
Доктор наук
Сообщения: 400
[Сообщение #9] 2 декабря 2011, 10:06

Цитата (Gudzik11):

а можешь на почту скинуть Gudzik11@ukr.net

Скинул

Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Gudzik11
Gudzik11
Посетитель
Сообщения: 8
[Сообщение #10] 2 декабря 2011, 16:31
спасибо буду пробовать .
вот придумал как обойти эту проблему но реализовать правильно не могу.

пытаюсь распарсить XML
тесть есть несколько тэгов <day я пытаюсь пронумеровать их так

procedure TForm1.Pogoda(Sender: TObject);
      var
        q: Integer ;
        s: string ;
 begin
   q:=1;
   GetDir(0,s);
    memo1.Text:=Utf8ToAnsi(IdHTTP1.Get('http://xml.weather.co.ua/1.2/forecast/19?dayf=5&userid=yoursite_com'));
    Memo1.Text:=Replace(Memo1.Text,'<?xml version="1.0" encoding="UTF-8"?>','<?xml version="1.0"
encoding="windows-1251"?>');
   while  q<>40 do
   begin
    q:=q+1 ;
    Memo1.Text:=Replace(Memo1.Text,'</day','</day'+IntToStr(q));
    Memo1.Text:=Replace(Memo1.Text,'<day','<day'+IntToStr(q));
    Label1.Caption:= IntToStr(q);
   end;
   Memo1.Lines.SaveToFile(s+'\1.xml');
    {&#238;&#242;&#234;&#240;&#251;&#226;&#224;&#229;&#236; XML}
    XMLDocument1.FileName:='1.xml';
    XMLDocument1.Active := true;
    Memo2.Text:=XMLDocument1.xml.Text ;
    XMLDocument1.Active := False ;
 end;


но на выходе получяю
<day4039383736353433323130292827262524232221201918 171615141312111098765432

не знаешь как сделать чтоб получилось
<day1
<day2
<day3


Страницы: «1» «2» (всего страниц: 2, текущая: 1)
Всего сообщений: 14 (сейчас показаны: с 1 по 10)

Перейти в раздел:


 © 2004 - 2024, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.04 сек.
Обратная связь