Hi,
WHen I try to serialize a TObjectList with a TROXMLSerializer I get the error ‘This name can not contain the < character’.
How can I do this?
Thanks,
Hi,
WHen I try to serialize a TObjectList with a TROXMLSerializer I get the error ‘This name can not contain the < character’.
How can I do this?
Thanks,
Hi,
can you show code snippet how to you do this, pls?
simple testcase will be appreciated too
Hi,
you can’t use TMYList.ClassName
as node name/tag because it has <
& >
in it’s value: TObjectList<Unit2.TMyObject>
.
workaround: you should replace <
and >
with underscore (_
) manually
Actually I also have nested collections the same way. How would I handle that? Changing the node name wont do that.
Hi,
you can check this case:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, uROXMLIntf, uROXMLSerializer,
Generics.Collections, uROTypes, uROArray;
type
TMyObject = class(TROComplexType)
private
fName: String;
published
property Name: String read fName write fName;
end;
TMyList = TROArray<TMyObject>;
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FObjects: TMyList;
function QuoteName(Value: string): string;
public
{ Public declarations }
procedure SaveXML;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
SaveXML;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
MyObject: TMyObject;
begin
FObjects := TMyList.Create();
MyObject := TMyObject.Create;
MyObject.Name := 'Object1';
FObjects.Add(MyObject);
MyObject := TMyObject.Create;
MyObject.Name := 'Object 2';
FObjects.Add(MyObject);
MyObject := TMyObject.Create;
MyObject.Name := 'Object 3';
FObjects.Add(MyObject);
end;
function TForm2.QuoteName(Value: string): string;
begin
Result:= StringReplace(Value,'<','_',[rfReplaceAll]);
Result:= StringReplace(Result,'>','_',[rfReplaceAll]);
end;
procedure TForm2.SaveXML;
var
doc1:IXMLDocument;
lxml:TROXMLSerializer;
s: tStream;
begin
doc1 := NewROXmlDocument;
doc1.New(QuoteName(TMYList.ClassName));
lxml := TROXMLSerializer.Create(pointer(doc1.DocumentNode));
try
lxml.Write(QuoteName(TMyList.ClassName), TMyList.ClassInfo, FObjects);
finally
lxml.Free;
end;
s:=TMemoryStream.Create;
try
doc1.SaveToStream(s);
s.Position := 0;
memo1.Lines.LoadFromStream(s);
finally
s.Free;
end;
end;
end.