|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как сформировать 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
|
||||
|
||||
Сейчас в выхлопе получается *.xml с содержимым
Цитата:
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (20.04.2018)
|
#3
|
||||
|
||||
Доброго времени суток!
Все правильно, он должен формироваться в такой последовательности. Код HTML:
Формирование результата должно быть следующим образом: Структура.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
|
||||
|
||||
Принято к выполнению (тоже самое и в другой топке), только нужно время, на работе весной отгулов не дают Ну правда, удивляюсь такой детализации ТЗ, сразу ясность появилась, словно на горной дороге из облака вырулил, мне б уже на втором баллоне рисовать надоело бы )
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
LIONSMILE (20.04.2018)
|
#5
|
||||
|
||||
Спасибо большое! Я подожду конечно. Все люди и всех есть свои дела, я прекрасно понимаю.
|
#6
|
||||
|
||||
Думал что-то сложное, но вы, как всегда проделали основную работу самостоятельно и обошлось всё вроде малой кровью, вот с небольшими добавками ваш обработчик жима восьмой кнопки
Код:
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
|
||||
|
||||
Огромное человеческое Спасибо и дай Бог тебе здоровья!
Все работает, подправил немного строки 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
|
||||
|
||||
Оффтопыч:
Спасибо, за все добрые, но порой, не заслуженные слова - хотите верьте, хотите нет: с *.xml раньше сталкивался, но то, что его можно пользовать стандартным компонентом, конечно, подозревал, но было лень разбираться, что куда, парсил до этого "ручками", энто долго и нудно, спасибо вам, подтолкнули к обучению. Ну правда, в шоке - вопрощающий лучше разбирается отвечающего в данном вопросе, видимо сильно вас эта тема задела, ну и как говорится, главное, что б на пользу! Ещё раз, спсб за добрые слова, но это и надо вам сказать Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
||||
|
||||
Да мне то за что)) Без Вас бы не разобрался точно. А что касамаемо XML - так по мне самый универсальный формат, который и читается спокойно СТАНДАРТНЫМИ средствами Delhi ранних версий, чего нельзя сказать о JSON, поддержка которого реализована, без дополнительных библиотек, стандартными компонентами в более поздних версиях. Еще немало важный момент то, что в XML можно хранить довольно большой объем данных. Типичный тому пример сайт открытых данных России, где большинство баз хранятся именно в XML. Да и множество API сервисов тоже реализовано по средствам XML (запрос - ответ). Софт (комплекс программ написан на Delphi), в котором я работаю, очень тесно сопряжен с XML, поскольку и обрабатывает данные в данном формате (импорт - экспорт и т.д.) и часть форм тоже в нем написана именно в XML.
P.S. Я только учусь) Последний раз редактировалось LIONSMILE, 21.04.2018 в 20:46. |