procedure ExtractData(Data: string; const Values: TStrings);
{ Процедура преобразует данные хранящиеся в строке с разделителем "," в список значений}
begin
{Данный алгоритм будет работать в Delphi 2009 и выше для младших версий
необходимо "вручную" разбирать данную строку и заполнять список}
Values.Clear;
Values.LineBreak := ',';
Values.Text := Data;
end;
function XMLRecord(XMLParentNode: IXMLNode; RecordIndex: Cardinal;
RecordHeader, RecordValues: TStrings): IXMLNode;
{ функция возвращает ссылку на ужел в основном XML документе для данной записи
XMLParentNode - корневой узел XML документа
RecordIndex - порядковый новер записи
RecordHeader - заголовок записи
RecordValues - значения записи}
var
XMLField: IXMLNode;
i: Integer;
begin
if RecordHeader.Count <> RecordValues.Count then begin
Result := nil;
Exit;
end;
Result := XMLParentNode.AddChild('RECORD');
Result.Attributes['id'] := RecordIndex;
for i := 0 to RecordHeader.Count - 1 do begin
XMLField := Result.AddChild('FIELD');
XMLField.Attributes['name'] := RecordHeader[i];
XMLField.Attributes['value'] := RecordValues[i];
end;
end;
procedure ConvertCSVToXML(CSVFile: TFileName; XMLDoc: TXMLDocument);
{ Процедура преобразует входящий CSVFile в XML документ}
var
fCSV: TextFile;
sData: string;
slHeader: TStringList;
slRecord: TStringList;
iRecordIndex: Cardinal;
begin
slHeader := TStringList.Create;
slRecord := TStringList.Create;
AssignFile(fCSV, CSVFile);
Reset(fCSV);
if not Eof(fCSV) then begin
XMLDoc.Active := True;
XMLDoc.DocumentElement := XMLDoc.CreateNode('RECORDS');
iRecordIndex := 0;
end;
while not Eof(fCSV) do begin
Readln(fCSV, sData);
if iRecordIndex = 0 then begin
Inc(iRecordIndex);
ExtractData(sData, slHeader);
Continue;
end;
ExtractData(sData, slRecord);
XMLRecord(XMLDoc.DocumentElement, iRecordIndex, slHeader, slRecord);
Inc(iRecordIndex);
end;
CloseFile(fCSV);
slHeader.Free;
slRecord.Free;
end;
procedure TForm1.btnconvertClick(Sender: TObject);
begin
lstXML.Clear;
xmldcmnt1.Active := False;
ConvertCSVToXML(lbledtFilename.Text, xmldcmnt1);
lstXML.Items.Text := FormatXMLData(xmldcmnt1.XML.Text);
end;
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.