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

Delphi Sources



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

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

Доброго времени суток!

Есть одно приложение, которое в своей работе использует файл POI в формате XML. Данные в этот файл (XML) переносятся из двух таблиц MS Excel. Все бы ничего, но возникла одна проблема, если строк в файлах MS Excel немного (10 - 20) то сформировать такой файл руками проблем нет, но если строк больше 100 и до N, то на это уходит не мало времени.
Возникла идея написать небольшое приложение, которое как раз и будет считывать данные из таблиц MS Excel, а затем уже из этих данных формировать файл найстроек в XML.
Проект: Создание_XML.ZIP
Проблем с написанием сего творения вроде бы нет, кроме одной. Я не могу понять как считанные с двух файлов Excel данные, обернуть в нужные тэги.
Коротко о самой программе: в Treeview выбирается тип POI. Затем загружается стандарный файл из другого приложения, из которого берутся данные для формирования первой строки XML файла. Далее открываются по очереди две таблицы Excel и данные заносятся в STRINGGRID1 и STRINGGRID2 соответственно. Теперь когда все заружено необходимо сформировать файл настроек. Саму стуктуру файла я сформировать могу, также и записать в нее первую строку, которая содержит информацию из файла-настроек. Далее должны по очереди в этот XML файл записываться данные из двух таблиц в атрибуты. Файлы настроек "navigator.nvg" и таблицы MS Excel "POI.xls" вложены в архив с проектом.
Участок кода, в который должны записываться данные из STRINGGRID1 и STRINGGRID2.
Код:
   iNode2:= iRoot.AddChild('OBJECT');                 
  iNode2.Attributes['Code'] := '0';                  
  iNode2.Attributes['Desc_100'] := '0';              
  iNode2.Attributes['CountConturs'] := '1';          
  iNode2.Attributes['CountPoint'] := '1';            
  iNode2.Attributes['LatitudeD'] := '0';             
  iNode2.Attributes['LongitudeD'] := '0';            
  XMLDocument1.SaveToFile('Save.xml');       

Как записать в атрибуты файла настроек в формате XML последовательно данные из двух таблиц MS Excel по структуре в проекте (415-420 строки)?

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

Сейчас в выхлопе получается *.xml с содержимым
Цитата:
?xml version="1.0" encoding="windows-1251"?>
<Document_Element>
<HEAD ObjectCount="24" SC="10000" Razr="0.1" Project="1"/>
<OBJ РЕГИОН="0" CountC="1" CountP="1" Latitude="0" Longitude="0"/>
</Document_Element>
если не трудно, покажите пжлст, прям "на кошечках" куда и откуда и что туда класть, немного не догоняю логику формирования результата
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (20.04.2018)
  #3  
Старый 18.04.2018, 04:27
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Доброго времени суток!

Все правильно, он должен формироваться в такой последовательности.
Код HTML:
<OBJ РЕГИОН="0" CountC="1" CountP="1" Latitude="0" Longitude="0"/>
- Вот это получается один объект из таблицы (разницы нет первая или вторая).
Формирование результата должно быть следующим образом:
Структура.jpg

Каждую строку из каждой таблицы записываем в таком виде:
<OBJ РЕГИОН="0" CountC="1" CountP="1" Latitude="0" Longitude="0"/> - где атрибуту Регион="ID" соответствует значение колонки ID, атрибуту Latitude="0" значение из колонки широта, и атрибуту Longitude="0" значение из колонки долгота.
Разницы нет из какой таблицы и в какой последовательности будут они обернуты тэгами. Важно чтобы они были в такой струкутуре как показано на рисунке. Т.е. Root-узел (<Document_Element>) далее идет заголовок документа (<HEAD/>) и далее один за одним объекты из таблиц 1 и 2, при этом каждый объект должен быть отдельным и висеть на одной ветке с HEAD как на рисунке.

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

Принято к выполнению (тоже самое и в другой топке), только нужно время, на работе весной отгулов не дают Ну правда, удивляюсь такой детализации ТЗ, сразу ясность появилась, словно на горной дороге из облака вырулил, мне б уже на втором баллоне рисовать надоело бы )
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (20.04.2018)
  #5  
Старый 18.04.2018, 14:26
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо большое! Я подожду конечно. Все люди и всех есть свои дела, я прекрасно понимаю.
Ответить с цитированием
  #6  
Старый 19.04.2018, 21:54
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Думал что-то сложное, но вы, как всегда проделали основную работу самостоятельно и обошлось всё вроде малой кровью, вот с небольшими добавками ваш обработчик жима восьмой кнопки
Код:
procedure TForm1.Button8Click(Sender: TObject);
var
  i: integer;
  iRoot, iNode: IXMLNode;
begin
  XMLDocument2.Active := True; // актвирируем XML документ
  XMLDocument2.Options := XMLDocument2.Options + [doNodeAutoIndent] -
    [doAutoSave]; // отключаем форматирование и автосохранение документа
  // Создаем служебный заголовок
  XMLDocument2.Version := '1.0'; // Указываем версию документа
  XMLDocument2.Encoding := 'windows-1251'; // Указываем кодировку для русского языка
  // Создаем корневой узел документа
  iRoot := XMLDocument2.AddChild('Document_Element'); // root узел документа
  // Создаем шапку документа с атрибутами
  iNode := iRoot.AddChild('HEAD'); // Название узла
  iNode.Attributes['ObjectCount'] := IntToStr(StringGrid2.RowCount + StringGrid1.RowCount);
  // Количество всех узлов "OBJECT"
  iNode.Attributes['SC'] := Edit1.Text; // Атрибут масштаб
  iNode.Attributes['Razr'] := Edit10.Text; // Атрибут разрешение
  iNode.Attributes['Project'] := Edit3.Text; // Атрибут проекция

  for i := 0 to StringGrid2.RowCount-1 do
   begin
    iNode:= iRoot.AddChild('OBJ');                 //Название узла
    iNode.Attributes['РЕГИОН'] := StringGrid2.Rows[i][0];                  //Атрибут регион
    iNode.Attributes['CountC'] := '1';          //Атрибут количества контуров (по умолчанию равен 1)
    iNode.Attributes['CountP'] := '1';          //Атрибут количества точек (по умолчанию равен 1)
    iNode.Attributes['Latitude'] := StringGrid2.Rows[i][1];             //Атрибут широта (записываем данные из Srtinggrid)
    iNode.Attributes['Longitude'] := StringGrid2.Rows[i][2];            //Атрибут долгота (записываем данные из Srtinggrid)
  end;

  for i := 0 to StringGrid1.RowCount-1 do
   begin
    iNode:= iRoot.AddChild('OBJ');                 //Название узла
    iNode.Attributes['РЕГИОН'] := StringGrid1.Rows[i][0];                  //Атрибут регион
    iNode.Attributes['CountC'] := '1';          //Атрибут количества контуров (по умолчанию равен 1)
    iNode.Attributes['CountP'] := '1';          //Атрибут количества точек (по умолчанию равен 1)
    iNode.Attributes['Latitude'] := StringGrid1.Rows[i][1];             //Атрибут широта (записываем данные из Srtinggrid)
    iNode.Attributes['Longitude'] := StringGrid1.Rows[i][2];            //Атрибут долгота (записываем данные из Srtinggrid)
  end;

  ShowMessage('Найтройки созданы. Сохраните результаты.');

  Button3.Enabled:= true;
end;
теперь сливает данные из двух сеток в один общий блок, посмотрите пжлст, мож надо было в разные их пихать, но вроде без разницы это

З.Ы. Косяк только что вылез - между данными разных сеток и в конце пролезают теги-пустышки, думаю, это из-за того, что в StringGridах есть последняя пустая строка, нужно или её грохать, или тогда в forах считать до StringGridХ.RowCount-2 do...

Последний раз редактировалось Alegun, 19.04.2018 в 22:27.
Ответить с цитированием
Этот пользователь сказал Спасибо Alegun за это полезное сообщение:
LIONSMILE (20.04.2018)
  #7  
Старый 19.04.2018, 23:05
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Огромное человеческое Спасибо и дай Бог тебе здоровья!
Все работает, подправил немного строки 22 и 32 - я видел - вот это вы имеете ввиду:
Пустые.jpg
Так я так и сделал - посчитал в них цикл StringGriD-ов 1 и 2
Код:
for i := 0 to StringGrid1.RowCount-1 do
пока попробовал стал писать ответ, спустился ниже - смотрю а там уже так написано)))
Все бьет - открыл файл MS Excel, там в каждой таблице по 25 строк (с учетом заголовков), но так как выше я сделал загрузку со второй строки MS Excel в StringGrid 1 и 2, то полчилось что выгружалось в каждую таблицу по 24 строки. Открыл полученный XML файл в Notepad++, грохнул все лишние строки, в итоге полчилось то, что и должно было получиться а именно 48 строк из двух таблиц обернутых в тэги.
Вот так как код написан сейчас он работает четко, без "пустышек".

Спасибо еще раз! От души!

Последний раз редактировалось LIONSMILE, 19.04.2018 в 23:12.
Ответить с цитированием
Этот пользователь сказал Спасибо LIONSMILE за это полезное сообщение:
Alegun (20.04.2018)
  #8  
Старый 20.04.2018, 23:43
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Оффтопыч:

Спасибо, за все добрые, но порой, не заслуженные слова - хотите верьте, хотите нет: с *.xml раньше сталкивался, но то, что его можно пользовать стандартным компонентом, конечно, подозревал, но было лень разбираться, что куда, парсил до этого "ручками", энто долго и нудно, спасибо вам, подтолкнули к обучению. Ну правда, в шоке - вопрощающий лучше разбирается отвечающего в данном вопросе, видимо сильно вас эта тема задела, ну и как говорится, главное, что б на пользу! Ещё раз, спсб за добрые слова, но это и надо вам сказать
Ответить с цитированием
  #9  
Старый 21.04.2018, 20:42
Аватар для LIONSMILE
LIONSMILE LIONSMILE вне форума
Новичок
 
Регистрация: 19.03.2018
Сообщения: 51
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Да мне то за что)) Без Вас бы не разобрался точно. А что касамаемо XML - так по мне самый универсальный формат, который и читается спокойно СТАНДАРТНЫМИ средствами Delhi ранних версий, чего нельзя сказать о JSON, поддержка которого реализована, без дополнительных библиотек, стандартными компонентами в более поздних версиях. Еще немало важный момент то, что в XML можно хранить довольно большой объем данных. Типичный тому пример сайт открытых данных России, где большинство баз хранятся именно в XML. Да и множество API сервисов тоже реализовано по средствам XML (запрос - ответ). Софт (комплекс программ написан на Delphi), в котором я работаю, очень тесно сопряжен с XML, поскольку и обрабатывает данные в данном формате (импорт - экспорт и т.д.) и часть форм тоже в нем написана именно в XML.

P.S. Я только учусь)

Последний раз редактировалось LIONSMILE, 21.04.2018 в 20:46.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter