Форум Программирование чтение XML |
Страницы: «1» «2» | |||||||
|
Здравствуйте! Облазил весь интернет но так и не нашёл понятного для меня метода . Пожалуйста помогите вывести в 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. | ||||||
|
А использовать TXMLDocument обязательно? Я давно юзаю XML, но этим компонентом ни разу не пользовался, ибо есть вещь получше. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! | ||||||
|
можно и xml если он на delphi 7 станет . А где скачять его и как пользоваться? | ||||||
|
Цитата (Gudzik11): А где скачять его и как пользоваться? TECXMLParser, в гугле найдёшь. С ним примеры. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! | ||||||
|
спасибо буду пробовать | ||||||
|
Поставил 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 Может напишешь мне какой нибудь примерчик небольшой ? | ||||||
|
Давай я тебе лучше модуль самодельный дам по работе с этим компонентом. А то у меня примеры уж больно все громоздкие, а писать что-то попроще времени нету. Вот, к примеру: 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@ukr.net а то в ECXMLParser хелпа нет | ||||||
|
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! | ||||||
|
спасибо буду пробовать . вот придумал как обойти эту проблему но реализовать правильно не могу. пытаюсь распарсить 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'); {îòêðûâàåì XML} XMLDocument1.FileName:='1.xml'; XMLDocument1.Active := true; Memo2.Text:=XMLDocument1.xml.Text ; XMLDocument1.Active := False ; end; но на выходе получяю <day4039383736353433323130292827262524232221201918 171615141312111098765432 не знаешь как сделать чтоб получилось <day1 <day2 <day3 | ||||||
Перейти в раздел:
© 2004 - 2024, Delphi.int.ru |
Версия форума: 1.10 (19.01.2010) |
Выполнено за 0.04 сек. |