procedure TXmlReflector.LoadFromXmlNode(ANode:IXMLNode);
var
Context: TRttiContext;
rttiType,tmpType: TRttiType;
Prop: TRttiProperty;
value:TValue;
AType:PTypeInfo;
tmpNode,subNode:IXMLNode;
AList:TList;
Obj:TObject;
begin
Context := TRttiContext.Create;
try
rttiType := Context.GetType(ClassType);
if ANode.HasChildNodes then
begin
tmpNode:=ANode.ChildNodes.First;
while Assigned(tmpNode) do
begin
prop:=rttiType.GetProperty(tmpNode.NodeName);
if tmpNode.IsTextElement then
begin
if Prop.PropertyType.TypeKind in [tkInteger,tkInt64] then
begin
AType:=TypeInfo(Int64);
value:=TValue.FromOrdinal(AType,StrToInt64Def(tmpNode.Text,0));
end else if Prop.PropertyType.TypeKind in [tkChar,tkString,tkWChar,tkLString,tkWString,tkUString,tkVariant] then
begin
value:=tmpNode.Text;
end else if Prop.PropertyType.TypeKind in [tkFloat] then//日期,浮点数
begin
value:=StrToFloatDef(tmpNode.Text,0.0);
end;
Prop.SetValue(Self,value);
end else //TList
begin
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
//谁帮我搞定这里,我现在只能用一个TDictionary来实现类的创建
Obj:=TypeDict.Items[subNode.NodeName].Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end; end;
end;
tmpNode:=tmpNode.NextSibling;
end;
end;
finally
Context.Free;
end;
end;
var
Context: TRttiContext;
rttiType,tmpType: TRttiType;
Prop: TRttiProperty;
value:TValue;
AType:PTypeInfo;
tmpNode,subNode:IXMLNode;
AList:TList;
Obj:TObject;
begin
Context := TRttiContext.Create;
try
rttiType := Context.GetType(ClassType);
if ANode.HasChildNodes then
begin
tmpNode:=ANode.ChildNodes.First;
while Assigned(tmpNode) do
begin
prop:=rttiType.GetProperty(tmpNode.NodeName);
if tmpNode.IsTextElement then
begin
if Prop.PropertyType.TypeKind in [tkInteger,tkInt64] then
begin
AType:=TypeInfo(Int64);
value:=TValue.FromOrdinal(AType,StrToInt64Def(tmpNode.Text,0));
end else if Prop.PropertyType.TypeKind in [tkChar,tkString,tkWChar,tkLString,tkWString,tkUString,tkVariant] then
begin
value:=tmpNode.Text;
end else if Prop.PropertyType.TypeKind in [tkFloat] then//日期,浮点数
begin
value:=StrToFloatDef(tmpNode.Text,0.0);
end;
Prop.SetValue(Self,value);
end else //TList
begin
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
//谁帮我搞定这里,我现在只能用一个TDictionary来实现类的创建
Obj:=TypeDict.Items[subNode.NodeName].Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end; end;
end;
tmpNode:=tmpNode.NextSibling;
end;
end;
finally
Context.Free;
end;
end;
begin
if Attri is TXmlAttri then
begin
tmpClass:=TXmlAttri(Attri).ClassT;
end;
end;
if (tmpNode.HasChildNodes)and(prop.PropertyType.Name='TList') then
begin
AList:=TList.Create;
value:=AList;
Prop.SetValue(Self,value);
subNode:=tmpNode.ChildNodes.First;
while Assigned(subNode) do
begin
Obj:=tmpClass.Create;
AList.Add(Obj);
TXmlReflector(Obj).LoadFromXmlNode(subNode);
subNode:=subNode.NextSibling;
end;
end else
begin
Obj:=tmpClass.Create;
value:=Obj;
Prop.SetValue(Self,value);
TXmlReflector(Obj).LoadFromXmlNode(tmpNode);
end;
自己搞定了,没人来吗,结贴了。