Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2011, 18:13   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Вопрос Добавление тегов в заголовок XML

Вечер добрый всем! Прошу помощи в следующей проблемке. Формирую XML файл таким кодом:
Код:
{Построение дерева}
procedure BuildTree_Dilers(const ARootDir : String; ANode : IXmlNode);
var
  ObjNode,ObjNode2 : IXmlNode;
begin
 ObjNode := ANode.AddChild( 'zglv_1' );
// ObjNode2 := ANode.AddChild( 'zglv_2' );
 ObjNode.AddChild('filename').Text:='0000000000';
 ObjNode.AddChild('version').Text:='1.0';
 ObjNode.AddChild('cod').Text:='000';
 ObjNode.AddChild('nrec').Text:='1068999';
// ObjNode2.SetAttributeNS( 'zglv_2', '', '001-001-001 01' );
end;
так сохраняю:
Код:
procedure SaveFolderTree_Dilers(const AFolder, AFileName : String);
var
  Doc : IXMLDocument;
  RootNode : IXmlNode;
begin
  Doc := NewXMLDocument;
  try
    Doc.Options := [ doNodeAutoIndent ];
    Doc.Active := True;
    RootNode := Doc.AddChild( 'main_menu' );
    BuildTree_Dilers( AFolder, RootNode );
    Doc.SaveToFile( AFileName );
  finally
    Doc := nil;
  end;
end;
так вызываю последнюю функцию:
Код:
procedure TForm1.mniXML2Click(Sender: TObject);
begin
   SaveFolderTree_Dilers('123123333321',ExtractFilePath(Application.ExeName) + 'test.xml');
   Form1.wb1.Navigate(ExtractFilePath(Application.ExeName) + 'test.xml');
end;
В итоге получается такое дерево (скрин "Сейчас"). Проблема с функцией
Код:
BuildTree_Dilers
, т.е. не могу добавить второй заголовок. Мне нужно добавить заголовок zglv_2, так, чтобы я мог сформировать такое дерево (скрин "Вариант_1"). А возможно ли сформировать дерево такое как на скрине "Вариант_2"? Прошу помощи по редактированию моего кода. Просьба отвечать по теме. Заранее спасибо.
Изображения
Тип файла: png Сейчас.png (7.1 Кб, 107 просмотров)
Тип файла: png Вариант_1.png (10.2 Кб, 108 просмотров)
Тип файла: png Вариант_2.png (10.3 Кб, 103 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 23.04.2011, 20:53   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
 ObjNode := ANode.AddChild( 'zglv_1' );
 ObjNode.AddChild('filename').Text:='0000000000';
 ObjNode.AddChild('version').Text:='1.0';
 ObjNode.AddChild('cod').Text:='000';
 ObjNode.AddChild('nrec').Text:='1068999';
 ObjNode := ANode.AddChild( 'zglv_2' );
 ObjNode.AddChild('number').Text:='1';
 ObjNode.AddChild('number').Text:='2';
а вариант два не соответствует xml-формату записи данных, разве что в виде ObjNode.AddChild('number').Text:='1 ,2,4,9'
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.04.2011 в 23:25.
Аватар вне форума Ответить с цитированием
Старый 24.04.2011, 06:15   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Зачет!). Спасибо). На счет формата я понял. Пара моментов. Как добавить название кодовой страницы рядом с <?xml version="1.0" ? В обычных XML файлах эта страница присутствует. Нужно, по условию задания, чтобы самая верхняя строчка была такой:
Код:
<?xml version="1.0" encoding="windows-1251"?>
Вот этот самый encoding="windows-1251" не могу добавить. Полагаю, что за строчку
Код:
?xml version="1.0"
отвечает код
Код:
    Doc.Options := [ doNodeAutoIndent ];
а вот для кодовой страницы не нашел такого.

И второй момент.
Мне нужно заполнить значения тега number номерами из одного поля БД (DBF). Записей очень много, больше 1 млн. Не пробовал пока, но можно ли организовать что-то типа такого цикла:
Код:
procedure BuildTree_Dilers(const ARootDir : String; ANode : IXmlNode);
var
  ObjNode : IXmlNode;
  i: Integer;
begin
 ObjNode := ANode.AddChild( 'zglv' );
 ObjNode.AddChild('filename').Text:='048104RQ01025';
 ObjNode.AddChild('version').Text:='1.0';
 ObjNode.AddChild('cod_pfr').Text:='048';
 ObjNode.AddChild('nrec').Text:='1068999';
 ObjNode := ANode.AddChild( 'snils' );
 Form1.qry1.Active:=False;
 Form1.qry1.SQL.Clear;
 Form1.qry1.SQL.Text:='select * from ' + ExtractFileName(ChangeFileExt(Form1.sStatusBar1.Panels[3].Text,''));
 Form1.qry1.Active:=True;
  Form1.sMemo1.Clear;
  Form1.qry1.First;
  while not Form1.qry1.Eof do
  begin
   Form1.sMemo1.Lines.Add(Form1.qry1.FieldByName('INSNMB').AsString);
   Application.ProcessMessages;
   for i:=0 to Form1.sMemo1.Lines.Count - 1 do
   begin
    Form1.XMLDocument1.AddChild('number',Form1.sMemo1.Lines.Strings[i]);
   end;
   Form1.qry1.Next;
   Application.ProcessMessages;
  end;
end;
??
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.04.2011, 09:00   #4
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

может так лутше, цикл думаю сами в нужном месте реализуете.

Код:
procedure TForm1.Button1Click(Sender: TObject);
VAR
Xmldoc:IXMLDocument;
Ninode:IXMLNode;
begin
Xmldoc:=TXMLDocument.Create(nil);
Xmldoc.Active:=True;
Xmldoc.Options:=Xmldoc.Options+[doNodeAutoIndent];
Xmldoc.Version:='1.0';
Xmldoc.Encoding:='Windows-1251';
with Xmldoc do
  begin
     with  AddChild('OPLIST') do
        begin 
           ChildValues['FILENAME']:='';
           ChildValues['SMOCOD']:='';
           ChildValues['PRZCOD']:='';
           ChildValues['NRECORDS']:='';
          with AddChild('OP') do
            begin
              ChildValues['N_REC']:='';
              ChildValues['ID']:='';
              ChildValues['TIP_OP']:='';
              with AddChild('PERSON') do
              begin
                ChildValues['FAM']:='';
                ChildValues['IM']:='';
                ChildValues['OT']:='';
                ChildValues['W']:='';
                ChildValues['DR']:='';
                ChildValues['TRUE_DR']:='';
                ChildValues['C_OKSM']:='';
                ChildValues['SS']:='';
                ChildValues['PHONE']:='';
                ChildValues['EMAIL']:='';
                ChildValues['FOIPR']:='';
                ChildValues['CONTACT']:='';
                ChildValues['DDEATH']:='';
              end;
           end;

        end;
  end;


Xmldoc.SaveToFile('C:\delphi\test\xml\1.xml');
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 24.04.2011, 09:16   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

BARNEY, огромное спасибо за пример построения дерева, в дальнейшем буду стараться использовать его. У меня вопрос в том, как можно (можно ли) ускорить построение 1 млн записей из Memo? А то долго как-то будет наверное.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.04.2011, 09:40   #6
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

дык вы попробуйте.... оно и так быстро должно быть... не думаю что вам каждый час потребуется данная выгрузка.... нельзя подождать?
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 24.04.2011, 09:46   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Попробую. Правда долго грузится все сначала в Мемо, 1 мульон же записей, после этого планирую присваивать в значение XML. Или, было бы правильнее результат запроса присваивать сразу в XML?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 24.04.2011, 10:34   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Или, было бы правильнее результат запроса присваивать сразу в XML?
Это 100%
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.04.2011, 11:08   #9
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

используйте параматезированный запрос для перегонки и будет вам счастье.
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 24.04.2011, 11:47   #10
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Вот, пытаюсь сделать дерево как в примере "Вариант 1" (сделал тестовую БД с 20 записями):
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 Xmldoc:IXMLDocument;
 Ninode:IXMLNode;
 i: Integer;
begin
 Form1.qry1.Active:=False;
 Form1.qry1.SQL.Clear;
 Form1.qry1.SQL.Text:='select * from ' + ExtractFileName(ChangeFileExt(Form1.sStatusBar1.Panels[3].Text,''));
 Form1.qry1.Active:=True;
 Application.ProcessMessages;
 Form1.sMemo1.Clear;
 Form1.qry1.First;
 Application.ProcessMessages;
 while not Form1.qry1.Eof do
 begin
  Form1.sMemo1.Lines.Add(Form1.qry1.FieldByName('INSNMB').AsString);
  Application.ProcessMessages;
  Form1.qry1.Next;
  Application.ProcessMessages;
 end;
 Application.ProcessMessages;

//============================ôîðìèðóþ äåðåâöå XML==============================
 Xmldoc:=TXMLDocument.Create(nil);
 Xmldoc.Active:=True;
 Xmldoc.Options:=Xmldoc.Options + [doNodeAutoIndent];
 Xmldoc.Version:='1.0';
 Xmldoc.Encoding:='Windows-1251';
 with Xmldoc do
  begin
     with  AddChild('list') do
        begin
          with AddChild('zglv') do
            begin
              ChildValues['filename']:='048101PS01025';
              ChildValues['version']:='1.0';
              ChildValues['cod']:='048';
              ChildValues['nrec']:=Form1.sStatusBar1.Panels[1].Text;
            end;
              with AddChild('number') do
              begin
                for i:=0 to Form1.sMemo1.Lines.Count - 1 do
                begin
                 ChildValues['number']:=Form1.sMemo1.Lines[i];
                end;
              end;
           end;
  end;
 Xmldoc.SaveToFile('C:\1.xml');
 Form1.wb1.Navigate('C:\1.xml');
end;
однако код:
Код:
 for i:=0 to Form1.sMemo1.Lines.Count - 1 do
 begin
  ChildValues['snils']:=Form1.sMemo1.Lines[i];
 end;
добавляет только последнюю строчку из Мемо. Как сделать, чтобы добавлялись все строки в тег number из Мемо?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление данных в XML файл. LexaL Помощь студентам 3 24.12.2010 09:25
сформировать xml-файл на основе другого xml-файла NieL Общие вопросы Delphi 2 21.12.2010 15:49
Добавление тегов sergiksergik Microsoft Office Excel 28 24.05.2010 21:49
Добавление узлов в XML в Delphi, исользуя Treeview Анастасия999 Помощь студентам 0 08.05.2010 10:05
как проверить заголовок XML? stan90 Общие вопросы по Java, Java SE, Kotlin 0 28.11.2009 18:18