|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как обработать трек навигатора в формате 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
|
||||
|
||||
Код:
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
|
||||
|
||||
Alegun, спасибо огромное! Все работает так как нужно!
|
#4
|
||||
|
||||
А вот еще вопрос касаемо 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
|
||||
|
||||
Разобрался с циклом, но теперь не получается вывести данные в массив.
Код:
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
|
||||
|
||||
Код:
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 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
|
||||
|
||||
Код:
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
|
||||
|
||||
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (25.03.2018)
|
#9
|
||||
|
||||
Цитата:
Пускай отрабатывает свое))) Спасибо огромное! Все работает! |