D2010 New RTTI 妙解 Xml DataBinding

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;

效果图:

时间: 2024-08-31 07:12:10

D2010 New RTTI 妙解 Xml DataBinding的相关文章

详解XML各种解析方法

即便对高级 XML 问题具有丰富经验的开发人员也不一定就完全了解 XML 最基本的一些问题.为了为您打下坚实的基础,本文讨论了最基本的 XML 服务:解析.本文介绍了各种解析方法,着重说明了各自的优缺点. 了解基础 从 XML 的出现至今大约有 9 年的时间了.对于可扩展标记语言来说这是一段不短的历程.现在很难找到完全不用 XML 的应用程序了. 但是和客户在一起的时候,仍然不可避免地发现基础性的东西尚未被透彻地全部理解.对复杂的 XML 主题理解透彻的开发人员,最近却发现对基础性的东西(比如解

SQL Server开发人员应聘常被问的问题妙解汇总

server|问题 目前在职场中很难找到非常合格的数据库开发人员.我的一个同事曾经说过:"SQL开发是一门语言,它很容易学,但是很难掌握." 在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题.下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题.它们按照从易到难的顺序排列.当您问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下. 您能向我简要叙述一下SQL Server 2000中使用的一些数据库对

SQL Server开发人员应聘常见问题妙解

目前在职场中很难找到非常合格的数据库开发人员.我的一个同事曾经说过:"SQL开发是一门语言,它很容易学,但是很难掌握." 在面试应聘的SQL Server数据库开发人员时,我运用了一套标准的基准技术问题.下面这些问题是我觉得能够真正有助于淘汰不合格应聘者的问题.它们按照从易到难的顺序排列.当您问到关于主键和外键的问题时,后面的问题都十分有难度,因为答案可能会更难解释和说明,尤其是在面试的情形下. 您能向我简要叙述一下SQL Server 2000中使用的一些数据库对象吗? 您希望听到的

韩寒突现《观音山》贴面范冰冰妙解北范南周

范冰冰与韩寒二次碰面 两人亲密贴面 两人开怀大笑 两人接受采访 两人耳语 寒上台与范冰冰握手 <观音山>主创大合影 范冰冰 范冰冰询问陈柏霖牙痛状况 范冰冰与陈柏霖 范冰冰与韩寒(点击小图看大图) 点击此处查看其它图片 新浪娱乐讯 <观音山>3月4日上映在即,今日在上海举行的首映发布会上,惊喜更是接二连三,除了首次将东京电影节获奖情景重现大打温情牌外,一位神秘嘉宾的突然亮相更是让到场媒体大呼意外! 首映礼突现韩寒 "寒冰"组合亲密互动妙语连珠 发布会进行到一半,

Android Style.xml的应用详解及代码实现_Android

Style.xml的妙用 Style.xml之于Android犹如css之于Jsp 妙用 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

.net xml节点读取详解

.net xml节点读取详解 <?xml version="1.0" encoding="iso-8859-1"?> <bookstore> <book>   <title lang="eng">harry potter</title>   <price>29.99</price> </book> <book>   <title la

D2010 RTTI + Attribute 简单实现ORM

还记得David I 今年四月来盛大时,被问及"反射机制能再做得好一点吗?我们想放弃RTTI",David I 回答"这的确是需要考虑的地方,当然RTTI我们不会放弃的".(这个白胡子的老哥哥还真很可爱,当年Borland几经起落,唯一能看得顺眼的就是David I). 我还以为RTTI在D2010最多只是改良,炒冷饭而已.没想到,RTTI不仅能反射Public.protected.Private里的信息,还能动态执行该类里的方法,更惊奇的是,还支持Attribut

Android Style.xml的应用详解及代码实现

Style.xml的妙用 Style.xml之于Android犹如css之于Jsp 妙用 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

Java中关于XML的API惊鸿一瞥

xml 简单介绍一下Java关于xml的API,这样大家看到了缩写就知道是干什么的了.水平有限,多多包涵. 1.JAXP(Java API for XML Parsing) 2.JAXB(Java API for XML Binding) 3.JAXM(Java API for XML Messaging) 4.JAX-RPC(Java API for XML-RPC) 1.JAXP定义了在Java中使用DOM, SAX, XSLT的通用的接口.这样在你的程序中你只要使用这些通用的接口,当你需要