Xml DataBinding最大的优点是,用接口和类替代了复杂繁琐的XML节点。一般使用当然没有问题,无非是XML层层的节点看作接口与接口的层级关系。但是,如果你想做一个通用的动态访问XML绑定接口类,问题就凸显麻烦了。由于TXMLDocument基于Interface机制,在生成的Xml DataBinding的Pas文件中,接口反而成了主导的访问入口,而具体的实体类,没有暴露属性,只是在protected实现了 Get 和Set 属性方法。
这种过渡的设计,导致了TypInfo单元里的RTTI也无法访问到具体的熟悉(因为没有属性嘛),而TypInfo的RTTI机制根本不能用于Interface。虽然可以参考 Web Service的接口机制,但其获取参数和赋值方式比较繁琐。万幸的是,D2010的的New RTTI落入人间,我们可以利用New RTTI做一个通用的访问XML绑定类,然后编译成DLL,这样一来,Delphi的各个版本也享受到New RTTI的好处。
姑且放下Xml DataBinding,我们先看看一段递归遍历接口的函数:
use Rtti;
/// <summary>
/// 递归接口方法
/// </summary>
/// <param name="typ">实体类的类型信息</param>
/// <param name="Level">层级数</param>
procedure TForm5.GetMethods(typ: TRttiType; const Level: Integer);
var
m:TRttiMethod;
Intf:IInterface;
begin
for m in typ.GetMethods do
begin
if (Pos('GET_',UpperCase(M.Name))=1) or
(Pos('GET_',UpperCase(M.Name))=1) then // Xml DataBinding 的属性方法默认以 "Get_"打头
Begin
mmo1.Lines.Add(PrintSpace(Level)+ m.Name); //PrintSpace打印空格函数,4个空格为一个层级
End;
if (m.ReturnType<>nil) and (m.ReturnType.TypeKind = tkInterface) then
begin
GetMethods(m.ReturnType,Level+1);
end;
end;
end;
/// <summary>
/// 打印空格函数
/// </summary>
/// <param name="Count"></param>
/// <returns></returns>
function TForm5.PrintSpace(const Count:Integer):WideString;
var
i:Integer;
begin
Result := '';
for i := 0 to Count do
begin
Result := Result + ' ';
end;
end;
调用示例:
procedure TForm5.btn1Click(Sender: TObject);
var
oml:IXMLOML_O21Type;
oml2:TXMLOML_O21Type;
typ:TRttiType;
p:TRttiProperty;
m:TRttiMethod;
begin
oml := LoadOML_O21('OML_O21.xml');//装载XML
oml2 := oml.GetInstance as TXMLOML_O21Type; //为了方便访问类的实例,稍微修改了Xml Binding单元
mmo1.Clear;
mmo1.Lines.Add('OML');
typ := TRttiContext.Create.GetType(TXMLOML_O21Type);//获取类的信息
GetMethods(typ,1);//递归打印
end;
效果图:
分享到:
相关推荐
SimpleXML D6-D2010 改正版 SimpleXML 一个可以解析 XML 文件的单元,之前在盒子发布的原版。 后来在用的过程中发现一 Bug,现在已改正。 主要为保存 XML 的时候,节点值太大时保存不正确, L > P 修改方法:...
VclSkin5.40-D7-D2010,皮肤控件。
此为最新版的,支持d2010/c2010,安装完成后,运行破解文件,目录指向安装目录下的LIB目录。这个版本我用了好长一段时间了!还有该软件的其他控件,在这里没有一一上传。该控件由于体积超过限制,分成了两个包
BusinessSkinForm v8.60 Cracked for CB5-CB2010 D5-D2010 这个是破解过的了,请放心下载。
该控件我已经安装应用,破解完全没有问题,如果不能用,那是你破解没有操作好!
+ added new TfrxDesignerRestriction: drDontEditReportScript and drDontEditInternalDatasets + adedd checksum calculating for 2 5 interleaved barcode + added TfrxGroupHeader.ShowChildIfDrillDown ...
DevExpress for D2010
TRichView 15.1 for D2010--XE7 注册版
indy10是D7-D2010下的控件,在D7和D2007安装成功。
TurboPower Async Professional 5.00 D7-D2010(内附安装说明)
TVideoCap2.3 For D7 and D2010 改过的TVideoCap2.3,由D7版改成D2010.已测试过用过! 主要是D7与D2010的类型变化问题.
ReportBuilder V15.05 for D2010
LMD.10.R2.D6.D2010.FS.rar
Business Skin Form for D2010
1st_Class_for_D2010 1st_Class_for_D2010 1st_Class_for_D2010 1st_Class_for_D2010
BusinessSkinform for Delphi2010 很多漂亮实用的控件,安装文件是bpl。在Component|Install Packages|add,选择bpl文件,点击OK,就就可以使用了。
ReportMachine for D7-D2010 解压后可安装 经验证 支持delphi7 - Delphi2010
Ehlib5.0.13含源码版,并做了汉化,在RS D2010上安装成功。 安装方法: 1、可直接解压到你的VCL的目录下, 2、将\Bin\System32\*.bpl复制到\windows\system32下, 3、启动RS D2010,直接在Install Components菜单窗口...
QuickReport5.04 for D2009 D2010
AlphaControls 2010 v7.33 Registred D2010