Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML - сохранение данных в файл 
:(
    Опции темы
Delphist
Дата 5.6.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Есть БД с данными. Нужно сделать так, чтобы программа умела сохранять данные в файл из БД и загружать даннные в БД из этого файла. Слышил, что для этих целей хорошо подходит XML. Прежде дело с XML не имел, поэтому хотелось бы узнать какие нароботки есть по данной теме.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Rodman
Дата 5.6.2007, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: нет
Всего: 122



TXMLDocument - тебе поможет... примеров куча... 
PM MAIL WWW Skype GTalk YIM MSN   Вверх
sw04
Дата 5.6.2007, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 372
Регистрация: 22.1.2007
Где: Ufa

Репутация: нет
Всего: 18



Пример из drkb.
Конвертация таблицы в xml:
Код

{ SMExport suite's free demo
Data export from dataset into XML-file
 
Copyright(C) 2000, written by Scalabium, Shkolnik Mike
E-Mail:  [email protected]
          [email protected]
WEB: http://www.scalabium.com
      http://www.geocities.com/mshkolnik
}
unit DS2XML;
 
interface
 
uses
Classes, DB;
 
procedure DatasetToXML(Dataset: TDataset; FileName: string);
 
implementation
 
uses
SysUtils;
 
var
SourceBuffer: PChar;
 
procedure WriteString(Stream: TFileStream; s: string);
begin
StrPCopy(SourceBuffer, s);
Stream.Write(SourceBuffer[0], StrLen(SourceBuffer));
end;
 
procedure WriteFileBegin(Stream: TFileStream; Dataset: TDataset);
 
function XMLFieldType(fld: TField): string;
begin
   case fld.DataType of
     ftString: Result := '"string" WIDTH="' + IntToStr(fld.Size) + '"';
     ftSmallint: Result := '"i4"'; //??
     ftInteger: Result := '"i4"';
     ftWord: Result := '"i4"'; //??
     ftBoolean: Result := '"boolean"';
     ftAutoInc: Result := '"i4" SUBTYPE="Autoinc"';
     ftFloat: Result := '"r8"';
     ftCurrency: Result := '"r8" SUBTYPE="Money"';
     ftBCD: Result := '"r8"'; //??
     ftDate: Result := '"date"';
     ftTime: Result := '"time"'; //??
     ftDateTime: Result := '"datetime"';
   else
   end;
   if fld.Required then
     Result := Result + ' required="true"';
   if fld.Readonly then
     Result := Result + ' readonly="true"';
end;
 
var
i: Integer;
begin
WriteString(Stream,
   '<?xml version="1.0" standalone="yes"?><!-- Generated by SMExport -->  ' +
   '<DATAPACKET Version="2.0">');
WriteString(Stream, '<METADATA><FIELDS>');
 
{write th metadata}
with Dataset do
   for i := 0 to FieldCount - 1 do
   begin
     WriteString(Stream, '<FIELD attrname="' +
       Fields[i].FieldName +
       '" fieldtype=' +
       XMLFieldType(Fields[i]) +
       '/>');
   end;
WriteString(Stream, '</FIELDS>');
WriteString(Stream, '<PARAMS DEFAULT_ORDER="1" PRIMARY_KEY="1" LCID="1033"/>');
WriteString(Stream, '</METADATA><ROWDATA>');
end;
 
procedure WriteFileEnd(Stream: TFileStream);
begin
WriteString(Stream, '</ROWDATA></DATAPACKET>');
end;
 
procedure WriteRowStart(Stream: TFileStream; IsAddedTitle: Boolean);
begin
if not IsAddedTitle then
   WriteString(Stream, '<ROW');
end;
 
procedure WriteRowEnd(Stream: TFileStream; IsAddedTitle: Boolean);
begin
if not IsAddedTitle then
   WriteString(Stream, '/>');
end;
 
procedure WriteData(Stream: TFileStream; fld: TField; AString: ShortString);
begin
if Assigned(fld) and (AString <> '') then
   WriteString(Stream, ' ' + fld.FieldName + '="' + AString + '"');
end;
 
function GetFieldStr(Field: TField): string;
 
function GetDig(i, j: Word): string;
begin
   Result := IntToStr(i);
   while (Length(Result) < j) do
     Result := '0' + Result;
end;
 
var
Hour, Min, Sec, MSec: Word;
begin
case Field.DataType of
   ftBoolean: Result := UpperCase(Field.AsString);
   ftDate: Result := FormatDateTime('yyyymmdd', Field.AsDateTime);
   ftTime: Result := FormatDateTime('hhnnss', Field.AsDateTime);
   ftDateTime:
     begin
       Result := FormatDateTime('yyyymmdd', Field.AsDateTime);
       DecodeTime(Field.AsDateTime, Hour, Min, Sec, MSec);
       if (Hour <> 0) or (Min <> 0) or (Sec <> 0) or (MSec <> 0) then
         Result := Result + 'T' + GetDig(Hour, 2) + ':' + GetDig(Min, 2) + ':' +
           GetDig(Sec, 2) + GetDig(MSec, 3);
     end;
else
   Result := Field.AsString;
end;
end;
 
procedure DatasetToXML(Dataset: TDataset; FileName: string);
var
Stream: TFileStream;
bkmark: TBookmark;
i: Integer;
begin
Stream := TFileStream.Create(FileName, fmCreate);
SourceBuffer := StrAlloc(1024);
WriteFileBegin(Stream, Dataset);
 
with DataSet do
begin
   DisableControls;
   bkmark := GetBookmark;
   First;
 
   {write a title row}
   WriteRowStart(Stream, True);
   for i := 0 to FieldCount - 1 do
     WriteData(Stream, nil, Fields[i].DisplayLabel);
   {write the end of row}
   WriteRowEnd(Stream, True);
 
   while (not EOF) do
   begin
     WriteRowStart(Stream, False);
     for i := 0 to FieldCount - 1 do
       WriteData(Stream, Fields[i], GetFieldStr(Fields[i]));
     {write the end of row}
     WriteRowEnd(Stream, False);
 
     Next;
   end;
 
   GotoBookmark(bkmark);
   EnableControls;
end;
 
WriteFileEnd(Stream);
Stream.Free;
StrDispose(SourceBuffer);
end;
 
end.


Добавлено через 12 минут и 54 секунды
для BDE есть проще метод.
автор Vit:
Код

Procedure CreateXML(Alias:string; XMLName:string);
var i,j,x,y:integer;
    f:TextFile;
    Tables:TStringList;
    Table:TTable;
 
Function FixValue(Value:string):string;
  var n:integer;
begin
  Result:='';
  For n:=1 to length(Value) do
    if Value[n] in ['0'..'9','a'..'z','A'..'Z','.',',','-',' ','/','*',':','{','}','_','@','\','+','%'] then
      result:=Result+Value[n]
    else
      result:=Result+'&#'+inttostr(ord(Value[n]))+';';
end;
 
Procedure WriteValue(Indent:integer; Name, ParamName, ParamValue, Value:string);
  var temp:string;
  const Empty='                                                             ';
begin
  Temp:=Copy(empty,1,Indent);
  temp:=temp+'<'+Name;
  if ParamName='' then temp:=temp+'>' else temp:=temp+' '+Paramname+'="'+FixValueParamValue)+'">';
  Temp:=Temp+FixValue(Value)+'</'+Name+'>';
  Writeln(f,temp);
end;
 
Procedure WriteTag(Indent:integer; Name, ParamName, ParamValue:string; pen:boolean=True);
  var temp:string;
  const Empty='                                                             ';
begin
  Temp:=Copy(empty,1,Indent);
  if Open then temp:=temp+'<'+Name else temp:=temp+'</'+Name;
  if ParamName='' then temp:=temp+'>' else temp:=temp+' '+Paramname+'="'+FixValueParamValue)+'">';
  Writeln(f,temp);
end;
 
begin
Tables:=TStringList.Create;
Table:=TTable.Create(nil);
try
  session.GetTableNames(Alias, '*.db',False, False, Tables);
  Table.DatabaseName:=Alias;
  assignFile(f,XMLName);
  reWrite(f);
  WriteTag(0, Alias, '', '', True);
  for i:=0 to Tables.Count-1 do
    begin
      Table.Active:=false;
      Table.TableName:=Tables[i];
      WriteTag(1, Table.tablename, '', '', True);
      Table.Active:=true;
      Table.First;
      For j:=0 to Table.RecordCount-1 do
        begin
          WriteTag(2, 'Rec', '', '', True);
          For x:=0 to Table.fields.count-1 do 
            WriteValue(4, Table.fields[x].FieldName, '', '', Table.fields[x].asstring);
          WriteTag(2, 'Rec', '', '', False);
          Table.Next;
        end;
      WriteTag(1, Table.tablename, '', '', False);
    end;
  WriteTag(0, Alias, '', '', False);
  CloseFile(f);
finally
  Tables.free;
  Table.free;
end;
 
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
CreateXML('MyDatabase', 'c:\XMLFile.xml');
end;



--------------------
<удалено администрацией>
PM   Вверх
mutex
Дата 5.6.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.10.2004

Репутация: нет
Всего: 3



Зачем все усложнять? Есть Борланд-компоненты ADODataSet и ClientDataSet со следующим методами:
1) TADODataSet.SaveToFile(FileName, pfXML).
2) TClientDataSet.SaveToFile(FileName, dfXML) или TClientDataSet.SaveToFile(FileName, dfXMLUTF8),
Метод для обратного действия называется LoadFromFile.
PM MAIL   Вверх
Insert
Дата 6.6.2007, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 13.4.2006

Репутация: нет
Всего: 1



Да но они сохраняют кучу ненужных полей и аттрибутов, если главное данные, а не структура файла то удобнее использовать их.
--------------------
пьяный русский кодер практически непобедим
PM MAIL   Вверх
Delphist
Дата 6.6.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(Insert @  6.6.2007,  08:17 Найти цитируемый пост)
Да но они сохраняют кучу ненужных полей и аттрибутов, если главное данные, а не структура файла то удобнее использовать их. 

Дело в том что данные хранятся в нескольких датасетах'ах, и dataset'ы мое FIBPlus, у которых нет SaveToFile


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
mutex
Дата 6.6.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.10.2004

Репутация: нет
Всего: 3



Цитата

Да но они сохраняют кучу ненужных полей и аттрибутов, если главное данные, а не структура файла то удобнее использовать их.

Они являются промышленными стандартами и обеспечивают универсальность проекту.

Цитата

Дело в том что данные хранятся в нескольких датасетах'ах, и dataset'ы мое FIBPlus, у которых нет SaveToFile

FIBPlus, как и любой потомок TDataset, может поставлять данные к TClientDataset через свойство TDataSetProvider.Dataset.
PM MAIL   Вверх
Delphist
Дата 6.6.2007, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(mutex @  6.6.2007,  16:15 Найти цитируемый пост)
FIBPlus, как и любой потомок TDataset, может поставлять данные к TClientDataset через свойство TDataSetProvider.Dataset. 

Ну а как заставить с нескольких датасетов, чтобы данные попадали в один файл. И как потом при згрузке данных из XML понять где данные первого датасета, где второго и т.д.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
mutex
Дата 6.6.2007, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.10.2004

Репутация: нет
Всего: 3



> Ну а как заставить с нескольких датасетов, чтобы данные попадали в один файл. И как потом при згрузке данных из XML понять где данные первого датасета, где второго и т.д.

Стандартные компоненты и методы не решают эту проблему. Получается, что у Вас XML-файл должен работать, например, как MDB-файл (MS Access).  Это слишком круто. И сложно. Не проще ли создать специальный дисковый каталог и писать каждый НД (датасет - набор данных) в виде отдельного файла?

PM MAIL   Вверх
Delphist
Дата 7.6.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(mutex @  6.6.2007,  19:52 Найти цитируемый пост)
и писать каждый НД (датасет - набор данных) в виде отдельного файла?

Да нет, мне нужно чтобы было все в одном файле


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Delphist
Дата 8.6.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Не подскажите хорошую инфу по XML, направленную именно на Delphi программиста БД.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.1028 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.