D2010 New RTTI 妙解 Xml DataBinding

简介: Xml DataBinding最大的优点是,用接口和类替代了复杂繁琐的XML节点。一般使用当然没有问题,无非是XML层层的节点看作接口与接口的层级关系。

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;

效果图:


相关文章
|
XML Java Android开发
sts工具右键new 新建文件没有Spring Bean Configuration File选项(不是一个很重要的功能选项啦,可以通过最简单的建立普通xml文件,然后到官网粘贴内容解决啦)
sts工具右键new 新建文件没有Spring Bean Configuration File选项(不是一个很重要的功能选项啦,可以通过最简单的建立普通xml文件,然后到官网粘贴内容解决啦)
521 0
sts工具右键new 新建文件没有Spring Bean Configuration File选项(不是一个很重要的功能选项啦,可以通过最简单的建立普通xml文件,然后到官网粘贴内容解决啦)
|
2月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
60 1
|
4月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
19天前
|
Java Maven
maven项目的pom.xml文件常用标签使用介绍
第四届人文,智慧教育与服务管理国际学术会议(HWESM 2025) 2025 4th International Conference on Humanities, Wisdom Education and Service Management
74 8
|
2月前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
26 3
|
6月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容
|
6月前
|
XML Java 数据格式
java解析xml文件内容
java解析xml文件内容
|
2月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
96 0
|
2月前
|
XML 存储 Web App开发
查看 XML 文件
查看 XML 文件
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
53 1