Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2018, 03:04
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Как обработать трек навигатора в формате XML

Доброго времени суток!
Обращаюсь к Вам за помощью, если конечно Вам не трудно, то помогите решить следующую проблему, с я которой столкнулся. Мне необходимо из файла (Навигатора с расширением GPX) который имеет структуру XML вывести данные в StringGrid.

Образец файла:

Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gpx
 xmlns="http://www.topografix.com/GPX/1/1"
 creator="Caucasia.ru - http://www.caucasia.ru"
 version="1.1"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<trk>
 <name>1648</name>
  <desc>Caucasia.ru track log 1648</desc>
<trkseg>
<trkpt lat="44.001403" lon="40.138943">
<ele>682.668861253353</ele>
<time>2018-02-16T06:17:04Z</time>
</trkpt>
<trkpt lat="44.001431" lon="40.138931">
<ele>678.371128992928</ele>
<time>2018-02-16T06:17:28Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>

Как добраться по веткам к атрибутам, прочитать их и вывести в StringGrid я разобрался. Но здесь у меня возникло два вопроса и как это сделать я не могу разобраться.
1. Атрибуты lat=" " и lon=" ", которые находятся в тэге <trkpt> затем начинают повторятся неоднократно в DOM-дереве файла и их может быть большое количество. Я смог считать только атрибуты из первой строки и записать их в StringGrid. Как прочитать все атрибуты lat=" " и lon=" ", находящиеся в тэге <trkpt>, который повторяется?
2. Как вывести правильно прочитанные данные в StringGrid, в столбцы 2 и 3, так как в первый столбец буду внесены значения, выбираемые в Combobox?

Т.е. проще говоря я не могу запустить цикл обработки атрибутов тэгов с одинаковыми названиями, потом все данные правильно записать в массив и вывести в таблицу.

Код того что у меня получилось:

Код:
procedure TForm1.Button1Click(Sender: TObject);
  begin
    XMLDocument1.LoadFromFile('D:\XML\1648.xml');
    XMLDocument1.Active := true;
    StringGrid1.RowCount:=StringGrid1.RowCount+1;
    StringGrid1.Cells[0,StringGrid1.RowCount-1]:=ComboBox1.Text;
    StringGrid1.Cells[1,StringGrid1.RowCount-1]:=VarToStr(XMLDocument1.DocumentElement.ChildNodes['trk'].ChildNodes['trkseg'].ChildNodes['trkpt'].Attributes['lat']);
    StringGrid1.Cells[2,StringGrid1.RowCount-1]:=VarToStr(XMLDocument1.DocumentElement.ChildNodes['trk'].ChildNodes['trkseg'].ChildNodes['trkpt'].Attributes['lon']);
XMLDocument1.Active := false;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:= 'Код объекта';
StringGrid1.Cells[1,0]:= 'Широта';
StringGrid1.Cells[2,0]:= 'Долгота';
end;

Спасибо заранее!

Последний раз редактировалось LIONSMILE, 20.03.2018 в 04:39.
Ответить с цитированием
  #2  
Старый 20.03.2018, 05:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 XMLDocument1.LoadFromFile('D:\XML\1648.xml');
 XMLDocument1.Active:= true;
 with XMLDocument1.DocumentElement.ChildNodes['trk'].ChildNodes['trkseg'] do
  for i:= 0 to ChildNodes.Count-1 do
   begin
    StringGrid1.RowCount:= StringGrid1.RowCount+1;
    StringGrid1.Cells[0,StringGrid1.RowCount-1]:= ComboBox1.Text;
    StringGrid1.Cells[1,StringGrid1.RowCount-1]:= VarToStr(ChildNodes.Nodes[i].Attributes['lat']);
    StringGrid1.Cells[2,StringGrid1.RowCount-1]:= VarToStr(ChildNodes.Nodes[i].Attributes['lon']);
   end;
 XMLDocument1.Active:= false;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (20.03.2018)
  #3  
Старый 20.03.2018, 06:29
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Alegun, спасибо огромное! Все работает так как нужно!
Ответить с цитированием
  #4  
Старый 23.03.2018, 02:37
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А вот еще вопрос касаемо XML, не могу разобраться с циклами снова. Теперь здесь одинаковые значения в тегах, которые необходимо получить.
Образец файла:
Код:
<?xml version="1.0" encoding="utf-8"?>
<weather created="eurometeo.ru" date="2018-03-21 22:00:00">
<city id="russia/moskva">
		<country>russia/moskva</country>
		<cityname>Москва</cityname>
		<cityname2>в Москвe</cityname2>
		<citytime>2018-03-21 23:00:00</citytime>
		<step>
			<datetime>2018-03-21 04:00:00</datetime>
			<pressure>742.43</pressure> 
			<temperature>-5.41</temperature>
			<humidity>25</humidity>
			<cloudcover>0</cloudcover> 
			<windspeed>0.67</windspeed>
			<windgust>0.86</windgust>
			<winddir>36</winddir>
			<precipitation>0.00</precipitation>
		</step>
		<step>
			<datetime>2018-03-21 10:00:00</datetime>
			<pressure>741.94</pressure> 
			<temperature>-2.95</temperature>
			<humidity>32</humidity>
			<cloudcover>0</cloudcover> 
			<windspeed>1.76</windspeed>
			<windgust>3.02</windgust>
			<winddir>299</winddir>
			<precipitation>0.00</precipitation>
		</step>

</city>
</weather>

и код того что получилось:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:= 'Наименование города';
StringGrid1.Cells[1,0]:= 'Время';
StringGrid1.Cells[2,0]:= 'Прогноз';
StringGrid1.Cells[3,0]:= 'Атмосферное давление';
StringGrid1.Cells[4,0]:= 'Температура воздуха ';
StringGrid1.Cells[5,0]:= 'Относительная влажность';
StringGrid1.Cells[6,0]:= 'Облачность';
StringGrid1.Cells[7,0]:= 'Скорость ветра';
StringGrid1.Cells[8,0]:= 'Скорость порывов ветра';
StringGrid1.Cells[9,0]:= 'Направление ветра';
StringGrid1.Cells[10,0]:= 'Осадки';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
XMLDocument1.LoadFromFile('test.xml');
XMLDocument1.Active := true;
with XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['datetime']  do
  for i:= 0 to ChildNodes.Count-1 do
   begin
StringGrid1.RowCount:= StringGrid1.RowCount+1;
StringGrid1.Cells[0,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['cityname'].Text);
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['citytime'].Text);
StringGrid1.Cells[2,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['datetime'].Text);
StringGrid1.Cells[3,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['pressure'].Text);
StringGrid1.Cells[4,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['temperature'].Text);
StringGrid1.Cells[5,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['humidity'].Text);
StringGrid1.Cells[6,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['cloudcover'].Text);
StringGrid1.Cells[7,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['windspeed'].Text);
StringGrid1.Cells[8,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['windgust'].Text);
StringGrid1.Cells[9,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['winddir'].Text);
StringGrid1.Cells[10,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['precipitation'].Text);
XMLDocument1.Active := false;
end;
end;

Смог прочитать данные только из первого блока, попытался сделать цикл по образцу, не читает. Что я делаю не так подскажите пожалуйста?
Ответить с цитированием
  #5  
Старый 23.03.2018, 07:28
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Разобрался с циклом, но теперь не получается вывести данные в массив.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
XMLDocument1.LoadFromFile('test.xml');
XMLDocument1.Active := true;
with XMLDocument1.DocumentElement.ChildNodes['city'] do
  for i:= 0 to ChildNodes.Count-1 do
   begin
StringGrid1.RowCount:= StringGrid1.RowCount+1;
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['cityname'].Text);
StringGrid1.Cells[2,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['citytime'].Text);
StringGrid1.Cells[3,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['datetime'].Text);
StringGrid1.Cells[4,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['pressure'].Text);
StringGrid1.Cells[5,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['temperature'].Text);
StringGrid1.Cells[6,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['humidity'].Text);
StringGrid1.Cells[7,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['cloudcover'].Text);
StringGrid1.Cells[8,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['windspeed'].Text);
StringGrid1.Cells[9,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['windgust'].Text);
StringGrid1.Cells[10,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['winddir'].Text);
StringGrid1.Cells[11,StringGrid1.RowCount-1]:=VarToStr (XMLDocument1.DocumentElement.ChildNodes['city'].ChildNodes['step'].ChildNodes['precipitation'].Text);
end;
XMLDocument1.Active := false;
end;

Теперь читает весь файл, но почему-то в каждую строчку выводит данные из первого блока.


Как исправить?
Ответить с цитированием
  #6  
Старый 23.03.2018, 15:38
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 i, j: integer;
begin
 XMLDocument1.LoadFromFile('test.xml');
 XMLDocument1.Active:= true;
 with XMLDocument1.DocumentElement.ChildNodes['city'] do
  for i := 0 to ChildNodes.Count-1 do
  if ChildNodes.Nodes[i].NodeName = 'step' then
  with StringGrid1 do
   begin
    RowCount:= RowCount+1;
    Cells[0,RowCount-1]:= VarToStr(ChildNodes['cityname'].Text);
    Cells[1,RowCount-1]:= VarToStr(ChildNodes['citytime'].Text);

    for j := 0 to ChildNodes.Nodes[i].ChildNodes.Count-1 do
     Cells[j+2, RowCount-1]:= VarToStr(ChildNodes.Nodes[i].ChildNodes.Nodes[j].Text);
   end;
 XMLDocument1.Active := false;
end;
Небольшой ликбез - конструкция with..do специально создана для сокращения набивки на клаве повторяющихся структур, и поэтому, "ледяной лёд" в виде
Код:
with XMLDocument1.DocumentElement.ChildNodes['city'] do
   begin
StringGrid1.Cells[1,StringGrid1.RowCount-1]:=VarToStr ({XMLDocument1.DocumentElement.ChildNodes['city'].}ChildNodes['cityname'].Text);
StringGrid1.Cells[2,StringGrid1.RowCount-1]:=VarToStr ({XMLDocument1.DocumentElement.ChildNodes['city'].}ChildNodes['citytime'].Text);
   end;
совершенно необязателен, всё, что в фигурных скобках можно смело выбросить, клавина мембрана пасибки не раз скажет :-)
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (23.03.2018)
  #7  
Старый 23.03.2018, 17:58
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию


Код:
with StringGrid1, XMLDocument1.DocumentElement.ChildNodes['city'] do
   begin
{StringGrid1.}Cells[1,StringGrid1.RowCount-1]:=VarToStr ({XMLDocument1.DocumentElement.ChildNodes['city'].}ChildNodes['cityname'].Text);
{StringGrid1.}Cells[2,StringGrid1.RowCount-1]:=VarToStr ({XMLDocument1.DocumentElement.ChildNodes['city'].}ChildNodes['citytime'].Text);
   end;
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #8  
Старый 23.03.2018, 18:32
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Ага, ТСу бы с одновложенностью справиться, и то б была подвижка :-Р
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (25.03.2018)
  #9  
Старый 23.03.2018, 21:17
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
клавина мембрана пасибки не раз скажет :-)

Пускай отрабатывает свое)))
Спасибо огромное! Все работает!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:13.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter