С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/54: Рейтинг темы: голосов - 54, средняя оценка - 4.83
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
1

Запись данных в XML

07.11.2012, 11:00. Просмотров 10197. Ответов 10
Метки нет (Все метки)

Как создать и записать в XML-файл данные, которые будут браться из формы? Нашел похожий пример, но он подставляет данные из шаблона
0
Вложения
Тип файла: rar LargeXml.rar (34.8 Кб, 256 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2012, 11:00
Ответы с готовыми решениями:

Запись в XML
Есть файл XML такого типа <?xml version="1.0" encoding="UTF-8"?>...

Запись между определенными тегами XML
Господа, подскажите мне неумелому.=) Вобщем ситуация такая - У меня есть...

Open/Save Dialog. Сериализация данных. Запись/чтение данных объектов в/из потока.
Описана файловая переменная FileOfFilms: file of TFilmArr и переменная,...

Считывание данных из XML
Привет Всем! Есть такая проблема необходимо из xml файла считать данные в memo...

Получение данных из XML
Добрый день! Есть XML файл с информацией. Вот небольшой фрагмент его кода: ...

10
Mawrat
12834 / 5742 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
07.11.2012, 14:56 2
Лучший ответ Сообщение было отмечено как решение

Решение

Начать можно с такого кода. На форму надо положить TButton, TSaveDialog и TXMLDocument.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Возвращает текст контрола.
function GetText(aCtrl : TControl) : String;
var
  Len: Integer;
begin
  Len := aCtrl.GetTextLen;
  SetString(Result, PChar(nil), Len);
  if Len > 0 then aCtrl.GetTextBuf(PChar(Result), Len + 1);
end;
 
//Создание XML документа, запись в него сведений о форме и компонентах на ней
//и запись XML документа в файл.
procedure TForm1.Button1Click(Sender: TObject);
var
  Doc, Node, ChNode : IXMLNode;
  Cmp : TComponent;
  Ctrl : TControl;
  i : Integer;
  Sd : TSaveDialog;
begin
  Sd := SaveDialog1; //SaveDialog1 уже должен быть на форме.
  if Sd.InitialDir = '' then
    Sd.InitialDir := ExtractFilePath(ParamStr(0));
  if not Sd.Execute then Exit;
  if FileExists(Sd.FileName) then begin
    i := MessageBox(0, 'Файл с заданным именем уже существует. Перезаписать?',
      'Внимание!', MB_YESNO + MB_ICONQUESTION + MB_APPLMODAL);
    if i <> IDYES then Exit;
  end;
 
  XMLDocument1.Active := True;
  //Включаем режим форматирования XML текста. И выключаем режим автосохранения.
  XMLDocument1.Options := XMLDocument1.Options + [doNodeAutoIndent] - [doAutoSave];
  //Заголовок XML документа.
  //XMLDocument1.AddChild('?xml version="1.0" encoding="utf-8"?');
  XMLDocument1.Version := '1.0';
  XMLDocument1.Encoding := 'utf-8';
  //Главный узел (узел документа).
  Doc := XMLDocument1.AddChild('document');
  //Добавляем сведения о текущей форме.
  Node := Doc.AddChild(Self.Name);
  Node.Attributes['ClassName'] := Self.ClassName;
  Node.Attributes['Text'] := Self.Text;
  //Добавляем сведения о компонентах, расположенных на форме.
  for i := 0 to Self.ComponentCount - 1 do begin
    Cmp := Self.Components[i];
    ChNode := Node.AddChild(Cmp.Name);
    ChNode.Attributes['ClassName'] := Cmp.ClassName;
    //Если компонент является контролом, то добавляем к узлу атрибут
    //с текстом этого контрола.
    if Cmp is TControl then begin
      Ctrl := TControl(Cmp);
      ChNode.Attributes['Text'] := GetText(Ctrl);
    end
  end;
 
  //Записываем XML документ в файл.
  XMLDocument1.SaveToFile(Sd.FileName);
end;
Пример XML файла, который создаёт эта программа:
XML
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<document>
  <Form1 ClassName="TForm1" Text="Создание XML документа">
    <Button1 ClassName="TButton" Text="Выполнить"/>
    <Edit1 ClassName="TEdit" Text="Пример"/>
    <XMLDocument1 ClassName="TXMLDocument"/>
    <SaveDialog1 ClassName="TSaveDialog"/>
  </Form1>
</document>
5
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
07.11.2012, 15:13  [ТС] 3
Огромное спасибо!
Насколько я понимаю это DOM-структура, а планируется выгружать большие файлы с помощью SAX
0
Mawrat
12834 / 5742 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
07.11.2012, 18:29 4
SAX парсеры применяются для анализа уже существующих XML документов. А здесь нам анализировать не нужно. Нам надо создать новый XML документ.
2
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
08.11.2012, 15:28  [ТС] 5
Еще вопрос: из базы данных SQL скриптом будет информация передаваться на форму в Delphi в компонент DBGrid, после данные из грида будут сохраняться в XML. В интернете нашел примерное решение через ClientDataSet.SaveToFile и написал (делал давно) пример, но он почему-то не сохраняет файл
0
Вложения
Тип файла: rar Прога.rar (401.5 Кб, 121 просмотров)
Mawrat
12834 / 5742 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
08.11.2012, 23:18 6
Я посмотрел проект.
Делается так. Надо на форму кинуть компонент DataSetProvider1 : TDataSetProvider. В его свойствах установить:
DataSet = ADOTable1
Затем, в компоненте ClientDataSet1 : TClientDataSet установить свойства:
Active = False
ProviderName = DataSetProvider1
Такая настройка позволит выгрузить в файл данные, возвращаемые набором ADOTable1.
Выгрузка данных в XML файл в кодировке UTF-8 выполняется так:
Delphi
1
2
3
ClientDataSet1.Open; //Это тоже самое, что и ClientDataSet1.Active := True;
ClientDataSet1.SaveToFile(Sd.FileName, dfXMLUTF8);
ClientDataSet1.Close;
2
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
09.11.2012, 12:10  [ТС] 7
Подскажите, пожалуйста, еще по такому вопросу: xml-файл должен выгружаться примерно в такой структуре:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="windows-1251"?>
<ROWDATA>
    <Inf>
    <kod_modeli>1</kod_modeli>
    <model>Lada 21073</model>
    <cvet>Красный</cvet>
    <Tech>
        <V_dvig>1500</V_dvig>
        <transm>
            <kpp>Механическая</kpp>
            <privod>Задний</privod>
        </transm>
    </Tech>
    <salon>Ткань</salon>
    </Inf>
    <Schet>
        <cena>120000</cena>
    </Schet>
</ROWDATA>
Как организовать запись данных в теги из хранилища данных (данные будут взяты из SQL в DBGrid, например) и насколько упадет скорость записи, если количество колонок (и, соответственно, сохраняемой информации) увеличится на 10 и более?
0
Mawrat
12834 / 5742 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
09.11.2012, 14:18 8
Цитата Сообщение от Начинающий Посмотреть сообщение
Как организовать запись данных в теги из хранилища данных (данные будут взяты из SQL в DBGrid, например) и насколько упадет скорость записи, если количество колонок (и, соответственно, сохраняемой информации) увеличится на 10 и более?
Надо составить SQL запрос, который будет выбирать данные из всех нужных таблиц. А потом можно или через TDataSetProvider выгрузить в XML или вручную XML сформировать. Поля из каждой строки набора данных можно записывать в XML шаблон. И заполненные шаблоны добавлять в общий XML документ. Можно через потоки (TStream) работать.
Если БД локальная, то всё весьма быстро будет выгружаться. Если работа идёт через сеть, то здесь уже надо смотреть на ширину канала и его загрузку. Скорость от множества составляющих зависит.
1
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
09.11.2012, 15:22  [ТС] 9
Скорее всего буду формировать вручную XML-файл, но только не понятно как записать значение колонки в XML из DBGrid, в котором уже будут данные для записи файла
0
Начинающий
38 / 38 / 16
Регистрация: 07.08.2012
Сообщений: 187
14.11.2012, 14:51  [ТС] 10
Уважаемые форумчане, прошу помощи! DBGrid1->DataSource1->ClientDataSet1->XMLTransformProvider1 (тут указываются шаблоны файлов) выгружает в XML-файл из DBGrid-а
Теперь нужно выгружать из базы: DBGrid1->DataSource1->ADODataSet1- вставляет в DBGrid, но как подключить ClientDataSet, чтобы была выгрузка в файл?
Вот кусок кода, который отвечает за выгрузку:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  str := TFileStream.Create ('data3.xml', fmCreate);
  try
    ClientDataSet1.Open;
    ClientDataSet1.First;
    s := '<?xml version="1.0" encoding="windows-1251"?><ZL_LIST>' ;
    str.Write(s[1], Length (s));
 
    while not ClientDataSet1.EOF do
    begin
      s := '';
      for i := 0 to ClientDataSet1.FieldCount - 1 do
        s := s + MakeXmlstr (ClientDataSet1.Fields[i].FieldName,
          ClientDataSet1.Fields[i].AsString);
 
      s := MakeXmlStr ('FILEandSCHET', s);
      str.Write(s[1], length (s));
 
      ClientDataSet1.Next;
 
    end;
    s := '</ZL_LIST>' ;
    str.Write(s[1], length (s));
  finally
    str.free;
  end;
0
n971030
154 / 101 / 4
Регистрация: 23.01.2010
Сообщений: 1,317
17.08.2013, 11:17 11
Цитата Сообщение от Mawrat Посмотреть сообщение
Начать можно с такого кода. На форму надо положить TButton, TSaveDialog и TXMLDocument.
Очень поучительная статья оказалась, может знаете подскажите - пишу базу для хранения файлов, кино музыка и т.п. вот только возникает интерес как можно сохранить в хмл например файл или картинку?
0
17.08.2013, 11:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 11:17

Вывод данных из xml
Добрый день. Как считывать данные из xml? XML у меня такой &lt;?xml...

Загрузка данных из XML
XMLDocument1.LoadFromFile('123.xml'); XMLDocument1.Active:=True; for I := 0...

Чтение данных из XML файлов
Есть у кого ни будь пример чтения данных из XML файлов. Выложите плиз или ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru