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



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.05.2022, 14:41
markII markII вне форума
Прохожий
 
Регистрация: 13.05.2022
Сообщения: 2
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Экспорт записей в xml

Всем добрый день!

Мне нужно из двух таблиц access экспортировать записи в xml. Пытаюсь сделать так:

Код:
var
 XmlDoc: TXmlDocument; 
 addroot, addnewchild: IXMLNode; 
begin
 ADOQ.SQL.Text :='select Dep, Name_user, Mail_user,  id_user, id_dep_u from tab_users, Ttab_dep where id_user = id_dep_u';
 ADOQ.Open;
  XmlDoc := TXmlDocument.Create(nil);
  XmlDoc.Active := true;
  XMLDocument1.Active := true;
  XmlDoc.Version := '1.0';
  XmlDoc.Encoding := 'UTF-8';

  addroot := XmlDoc.AddChild('City');
  while Not ADOQ.Eof do
    begin
      addnewchild := root.AddChild('Dep');
      addnewchild.SetAttribute(WideString('NameDep'), ADOQ.FieldByName('Dep').AsString);
      addnewchild := addnewchild .AddChild('User');
      addnewchild.SetAttribute(WideString('Name'),ADOQ.FieldByName('Name_user').AsString);
      addnewchild.SetAttribute(WideString('Mail'),ADOQ.FieldByName('Mail_user').AsString);
    end;
	ADOQ.Next
  XmlDoc.SaveToFile('C:\users.xml');
end;

Получаю файл с таким форматом:

Код HTML:
<?xml version="1.0" encoding="UTF-8"?> <City> <Dep Name="ПТО"> <User Name="Иванов Иван Иванович" Mail="ivanov@domennn.ru"/> </Dep> <Dep Name="ПТО"> <User Name="Никаноров Петр Семенович" Mail="nikanorov@domennn.ru"/> </Dep> <Dep Name="ПТО"> <User Name="Петров Яков Аронович" Mail="yakov@domennn.ru"/> </Dep> <City>

Но мне нужно чтобы элемнеты были сгрупированы вот так:

Код HTML:
<?xml version="1.0" encoding="UTF-8"?> <City> <Dep Name="ПТО"> <User Name="Иванов Иван Иванович" Mail="ivanov@domennn.ru"/> <User Name="Никаноров Петр Семенович" Mail="nikanorov@domennn.ru"/> <User Name="Петров Яков Аронович" Mail="yakov@domennn.ru"/> </Dep> </City>

Может кто-нибудь подсказать как сделать группировку? Если я думаю в правильном направлении нужно сделать цикл в запросе, который обходил бы поле id_dep_u? Или цикл при добавлении
Код:
addnewchild := addnewchild .AddChild('User')
?
Никак не придумаю)

Последний раз редактировалось markII, 13.05.2022 в 14:51.
Ответить с цитированием
  #2  
Старый 13.05.2022, 17:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,785
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Можно проще. Просто проверяй на изменене значения в поле Dep и только в этом случае создавай новый узел.

Как-то так:
Код:
  DepName := '';
  DepNode := Nil;
  addroot := XmlDoc.AddChild('City');
  while Not ADOQ.Eof do
    begin
	  if DepName <> ADOQ.FieldByName('Dep').AsString Then
	    begin
          DepNode := root.AddChild('Dep');
          DepNode.SetAttribute(WideString('NameDep'), ADOQ.FieldByName('Dep').AsString);
          DepName := ADOQ.FieldByName('Dep').AsString;
		end;  
      addnewchild := DepNode.AddChild('User');
      addnewchild.SetAttribute(WideString('Name'),ADOQ.FieldByName('Name_user').AsString);
      addnewchild.SetAttribute(WideString('Mail'),ADOQ.FieldByName('Mail_user').AsString);
	  ADOQ.Next
    end;

Последний раз редактировалось lmikle, 13.05.2022 в 21:04.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
markII (14.05.2022)
  #3  
Старый 14.05.2022, 00:08
markII markII вне форума
Прохожий
 
Регистрация: 13.05.2022
Сообщения: 2
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Можно проще. Просто проверяй на изменене значения в поле Dep и только в этом случае создавай новый узел.

Как-то так:
Код:
  DepName := '';
  DepNode := Nil;
  addroot := XmlDoc.AddChild('City');
  while Not ADOQ.Eof do
    begin
	  if DepName <> ADOQ.FieldByName('Dep').AsString Then
	    begin
          DepNode := root.AddChild('Dep');
          DepNode.SetAttribute(WideString('NameDep'), ADOQ.FieldByName('Dep').AsString);
          DepName := ADOQ.FieldByName('Dep').AsString;
		end;  
      

Спасибо! Все получилось, правда не сразу). Не хватало еще сортировки по id_dep.

Последний раз редактировалось markII, 14.05.2022 в 04:05.
Ответить с цитированием
  #4  
Старый 16.05.2022, 04:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,785
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну да, предполагается, что датасет отсортирован.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
markII (19.05.2022)
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter   Ссылка на Telegram