Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Импорт xml файла   Найти похожие ветки 

 
ktt   (2005-09-21 17:12) [0]

Этой функцией я делаю экспорт таблицы в xml, нету ли у вас
функции для приема сформированного файла ? Чтобы отобразить в dbGrid. Заранее благодарю.  

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.

//Beispiel, Example:

uses DS2XML;

procedure TForm1.Button1Click(Sender: TObject);
begin
 DatasetToXML(Table1, "test.xml");
end;


 
umbra ©   (2005-09-21 17:59) [1]

А почему бы для облегчения этого ужаса (в смысле парсения xml-файла) не пользоваться компонентом TXMLdoc с вкладки Internet? Если структура таблиц фиксирована, то можно еще больше облегчить себе жизнь: с помощью мастера Xml Data Binding (File\New\Other\XML data binding wizard) можно сгенерировать интерфейс для xml конкретной структуры. Подробности - в хелпе



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.016 c
14-1126612702
leonidus
2005-09-13 15:58
2005.10.09
Объясните мне на пальцах про индексы


4-1123760378
VNavigator
2005-08-11 15:39
2005.10.09
Вызов контекстного меню проводника


4-1123735019
ndn
2005-08-11 08:36
2005.10.09
Медленная печать на матричном принтере


4-1123692913
Bios_
2005-08-10 20:55
2005.10.09
Удаление пустого каталога


9-1117763063
Slavikk
2005-06-03 05:44
2005.10.09
GLScene и OpenGL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский