Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{Unit to export a dataset to XML} unitDS2XML; 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
;