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

Форум / Программирование - чтение 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,'','');
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,'','');
while q<>40 do
begin
q:=q+1 ;
Memo1.Text:=Replace(Memo1.Text,' Memo1.Text:=Replace(Memo1.Text,' Label1.Caption:= IntToStr(q);
end;
Memo1.Lines.SaveToFile(s+'\1.xml');
{îòêðûâàåì XML}
XMLDocument1.FileName:='1.xml';
XMLDocument1.Active := true;
Memo2.Text:=XMLDocument1.xml.Text ;
XMLDocument1.Active := False ;
end;


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

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


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

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


 © 2004 - 2018, Delphi.int.ru
Версия форума: 1.10 (19.01.2010)
RSS Delphi.int.ru Expert Код
Выполнено за 0.06 сек.
Обратная связь  
Рейтинг@Mail.ru Majordomo.ru - надёжный хостинг