• XML和对象属性互转的基类


    本人做了一个XML和对象属性互转的基类,现在放上来有兴趣拿去看一下,用法很简单,声明一个BaseConversion的子类,该子类与你想转换的对象相对应,然后覆盖基类的两个虚方法,然后在里面写元素与对象属性的转换即可以,废话少说了,还是看代码了,例子也懒得去写了,相信不会很难看懂的:

    unit XMLConversion; 

    {******************************************* 
     * brief: XML和对象属性的转换 
     * autor: linzhenqun 
     * date: 2005-10-26 
     * email: linzhengqun@163.com 
     * blog: http://blog.csdn.net/linzhengqun 
    ********************************************} 

    interface 
    uses 
      Classes, SysUtils, xmldom, XMLIntf, oxmldom, XMLDoc; 

    Type 

      TBaseConversion = class 
      protected 
        FXMLDoc: TXMLDocument; 

        (* ParenElem元素下增加一个子元素 *) 
        function AppendChildElement(const TagName, Value: WideString; 
          ParenElem: IDOMElement): IDOMElement; 

        (* 根据TagName取得XML节点下的某一个子节点 *) 
        function GetSingleEleByTagName(AEle: IDOMElement; TagName: WideString): IDOMElement;

        (* 取得XML节点的文本 *) 
        function GetElementText(AElement: IDOMNode): WideString; 

        (* IDOMElementtext值转换成各种类型的数据, 
           如果AElem=nil或者text不符合某些数据类型,返回Default *) 
        function EleTextToBoolDef(AElem: IDOMElement; const Default: Boolean): Boolean; 
        function EleTextToStrDef(AElem: IDOMElement; const Default: WideString): WideString;
        function EleTextToIntDef(AElem: IDOMElement; const Default: Integer): Integer; 
        function EleTextToFloatDef(AElem: IDOMElement; const Default: Extended): Extended; 

        (* 取得IDomElement的属性的值,并转换成各种类型 
           如果不符合数据类型,返回Default *) 
        function EleAttrToBoolDef(AElem: IDOMElement; AttrName: WideString; 
          const Default: Boolean): Boolean; 
        function EleAttrToStrDef(AElem: IDOMElement;  AttrName: WideString; 
          const Default: WideString): WideString; 
        function EleAttrToIntDef(AElem: IDOMElement;  AttrName: WideString; 
          const Default: Integer): Integer; 
        function EleAttrToFloatDef(AElem: IDOMElement;  AttrName: WideString; 
          const Default: Extended): Extended; 

        procedure ObjPropertyToElements(Obj: TObject); virtual; 
        procedure ElementsToObjProperty(Obj: TObject); virtual; 
      public 
        procedure XMLToObjProperty(XMLStream: TStream; Obj: TObject); 
        procedure ObjPropertyToXML(XMLStream: TStream; Obj: TObject); 
        constructor Create; 
        destructor Destroy; override; 
      end; 

    implementation 

    { TBaseConversion } 

    function TBaseConversion.AppendChildElement(const TagName, 
      Value: WideString; ParenElem: IDOMElement): IDOMElement; 
    var 
      Text: IDOMText; 
    begin 
      Result := FXMLDoc.DOMDocument.createElement(TagName); 
      if Value <> '' then 
      begin 
        Text := FXMLDoc.DOMDocument.createTextNode(Value); 
        Result.appendChild(Text); 
      end; 
      ParenElem.appendChild(Result); 
    end; 

    constructor TBaseConversion.Create; 
    var 
      Vendor: TDOMVendor; 
    begin 
      FXMLDoc := TXMLDocument.Create(nil); 

      //下面这几句代码可以去掉,则将使用MSXML来解析 
      //现在是用OpenXML的原生代码解析 
      Vendor := DOMVendors.Find('Open XML'); 
      if Vendor <> nil then 
        FXMLDoc.DOMVendor := Vendor; 
    end; 

    destructor TBaseConversion.Destroy; 
    begin 
      FXMLDoc.Free; 
      inherited; 
    end; 

    function TBaseConversion.EleAttrToBoolDef(AElem: IDOMElement; AttrName: WideString; 
      const Default: Boolean): Boolean; 
    var 
      LNode: IDOMNode; 
    begin 
      Result := Default; 
      if AElem <> nil then 
      begin 
        LNode := AElem.attributes.getNamedItem(AttrName); 
        if LNode <> nil then 
          Result := StrToBoolDef(LNode.nodeValue, Default); 
      end 
    end; 

    function TBaseConversion.EleAttrToFloatDef(AElem: IDOMElement; AttrName: WideString; 
      const Default: Extended): Extended; 
    var 
      LNode: IDOMNode; 
    begin 
      Result := Default; 
      if AElem <> nil then 
      begin 
        LNode := AElem.attributes.getNamedItem(AttrName); 
        if LNode <> nil then 
          Result := StrToFloatDef(LNode.nodeValue, Default); 
      end 
    end; 

    function TBaseConversion.EleAttrToIntDef(AElem: IDOMElement; AttrName: WideString; 
      const Default: Integer): Integer; 
    var 
      LNode: IDOMNode; 
    begin 
      Result := Default; 
      if AElem <> nil then 
      begin 
        LNode := AElem.attributes.getNamedItem(AttrName); 
        if LNode <> nil then 
          Result := StrToIntDef(LNode.nodeValue, Default); 
      end 
    end; 

    function TBaseConversion.EleAttrToStrDef(AElem: IDOMElement; AttrName: WideString; 
      const Default: WideString): WideString; 
    var 
      LNode: IDOMNode; 
    begin 
      Result := Default; 
      if AElem <> nil then 
      begin 
        LNode := AElem.attributes.getNamedItem(AttrName); 
        if LNode <> nil then 
          Result := LNode.nodeValue; 
      end 
    end; 

    procedure TBaseConversion.ElementsToObjProperty(Obj: TObject); 
    begin 
    end; 

    function TBaseConversion.EleTextToBoolDef(AElem: IDOMElement; 
      const Default: Boolean): Boolean; 
    begin 
      if AElem <> nil then 
        Result := StrToBoolDef(GetElementText(AElem), Default) 
      else 
        Result := Default; 
    end; 

    function TBaseConversion.EleTextToFloatDef(AElem: IDOMElement; 
      const Default: Extended): Extended; 
    begin 
      if AElem <> nil then 
        Result := StrToFloatDef(GetElementText(AElem), Default) 
      else 
        Result := Default; 
    end; 

    function TBaseConversion.EleTextToIntDef(AElem: IDOMElement; 
      const Default: Integer): Integer; 
    begin 
      if AElem <> nil then 
        Result := StrToIntDef(GetElementText(AElem), Default) 
      else 
        Result := Default; 
    end; 

    function TBaseConversion.EleTextToStrDef(AElem: IDOMElement; 
      const Default: WideString): WideString; 
    begin 
      if AElem <> nil then 
        Result := GetElementText(AElem) 
      else 
        Result := Default; 
    end; 

    function TBaseConversion.GetElementText(AElement: IDOMNode): WideString; 
    begin 
      Result := AElement.firstChild.nodeValue; 
    end; 

    function TBaseConversion.GetSingleEleByTagName(AEle: IDOMElement; 
      TagName: WideString): IDOMElement; 
    var 
      LNodeList: IDOMNodeList; 
    begin 
      Result := nil; 
      LNodeList := AEle.getElementsByTagName(TagName); 
      if LNodeList <> nil then 
        Result := LNodeList.item[0] as IDOMElement; 
    end; 

    procedure TBaseConversion.ObjPropertyToElements(Obj: TObject); 
    begin 
    end; 

    procedure TBaseConversion.ObjPropertyToXML(XMLStream: TStream; 
      Obj: TObject); 
    begin 
      FXMLDoc.XML.Clear; 
      FXMLDoc.Active := True; 
      FXMLDoc.Encoding := 'utf-8'; 
      ObjPropertyToElements(Obj); 
      FXMLDoc.SaveToStream(XMLStream); 
    end; 

    procedure TBaseConversion.XMLToObjProperty(XMLStream: TStream; 
      Obj: TObject); 
    begin 
      FXMLDoc.LoadFromStream(XMLStream); 
      ElementsToObjProperty(Obj); 
    end; 

    end.

    http://blog.csdn.net/linzhengqun/article/details/529307

  • 相关阅读:
    Sa提权sql语句大全
    转载 使用AJAX实现动态刷新页面功能
    VirtualBox宿主机与虚拟机的数据共享数据空间
    SP_OACreate提权经验
    linux mysql启动错误
    Microsoft SQL Server SA权限最新入侵方法 不用net user添加账户
    Java中关于HashMap的使用和遍历
    转载 突破360防黑加固添加用户
    个人随想BLOG
    面试题收集
  • 原文地址:https://www.cnblogs.com/findumars/p/5294130.html
Copyright © 2020-2023  润新知