- Код: Выделить всё
procedure TRequestBody.ToXML(const XMLNode: TDomNode);
var
PropList: TPropInfoList;
i: integer;
PI : PPropInfo;
PT : PTypeInfo;
xDoc: TXMLDocument;
RootNode, ParentNode, Node: TDomNode;
begin
xDoc := TXMLDocument.Create;
try
RootNode := xDoc.CreateElement('RequestBody');
xDoc.AppendChild(RootNode);
RootNode := xDoc.DocumentElement;
PropList := TPropInfoList.Create(Self,tkProperties);
for i := 0 to PropList.Count - 1 do
begin
PI := PropList.Items[i];
PT:=PI^.PropType;
//Str := Pi^.Name;
ParentNode := xDoc.CreateElement(Pi^.Name);
case PT^.Kind of
tkInteger:
Node := xDoc.CreateTextNode(IntToStr(GetOrdProp(Self,PI)));
tkSString,
tkLString,
tkAString:
Node := xDoc.CreateTextNode(GetStrProp(Self,PI));
tkFloat :
if (PT=TypeInfo(TDateTime)) then
Node := xDoc.CreateTextNode(DateTimeToStr(GetFloatProp(Self,PI)));
end;
ParentNode.AppendChild(Node);
RootNode.AppendChild(ParentNode);
//ParentNode.NodeValue:=;
end;
finally
XMLNode.AppendChild(RootNode.CloneNode(true,XMLNode.OwnerDocument));
xDoc.Free;
end;
end;
А на выходе, я получаю совершенно не тот порядок полей. Поля класса сортируются во время компиляции чтоли? Можно ли как-то получить всё же из RTTI порядок полей, как они описаны в классе, без сортировки? Или же придётся городить лесенку типа:
- Код: Выделить всё
RootNode := xDoc.DocumentElement;
ParentNode := xDoc.CreateElement('ProtocolLabel');
Node := xDoc.CreateTextNode(self.ProtocolLabel);
ParentNode.AppendChild(Node);
RootNode.AppendChild(ParentNode);
ParentNode := xDoc.CreateElement('ProtocolVersion');
Node := xDoc.CreateTextNode(self.ProtocolVersion);
RootNode.AppendChild(ParentNode);
Всё таки хотелось бы решить задачу изящно-))