本人做了一个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;

(* IDOMElement的text值转换成各种类型的数据, 
       如果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

XML和对象属性互转的基类的更多相关文章

  1. python面对对象编程---------6:抽象基类

    抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...

  2. C#中将xml文件反序列化为实例时采用基类还是派生类的问题

    基类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  3. DDD的实体、值对象、聚合根的基类和接口:设计与实现

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD 2 实现值对象 值对象有两个主要特征:它们没有任何标识.它们是不可变的. 我们举个例子:小明是"浙江宁波"人,小红也是 ...

  4. XML带多属性解析为一个实体类(利用反射)

    最近在对接一个银行的项目,大概就是类似一个钱包的功能,在请求返回的数据时,发现返回的数据标准的XML格式的支付串,格式如下 <kColl id="inputOrig" app ...

  5. C++派生类中如何初始化基类对象(五段代码)

    今天收到盛大的面试,问我一个问题,关于派生类中如何初始化基类对象,我在想派生类对于构造函数不都是先构造基类对象,然后在构造子类对象,但是如果我们在成员初始化列表先初始化派生类的私有成员,在函数内去调用 ...

  6. C++:基类与派生类对象之间的赋值兼容关系

    4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...

  7. 实现对象属性的lazy-loading(延迟加载)

    一.延迟加载器LazyLoader作用:       说到延迟加载,应该经常接触到,尤其是使用Hibernate的时候,本篇将通过一个实例分析延迟加载的实现方式.LazyLoader接口继承了Call ...

  8. python之类与对象属性的增删改查

    类属性与对象属性的增删改查 类属性的增删改查 class School: """ 文档 """ Teacher = "老王&quo ...

  9. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

随机推荐

  1. lvs、haproxy、nginx 负载均衡的比较分析

    lvs和nginx都可以用作多机负载的方案,它们各有优缺,在生产环境中需要好好分析实际情况并加以利用. 首先提醒,做技术切不可人云亦云,我云即你云:同时也不可太趋向保守,过于相信旧有方式而等别人来帮你 ...

  2. InputStream中read()与read(byte[] b)

    原文:InputStream中read()与read(byte[] b) read()与read(byte[] b)这两个方法在抽象类InputStream中前者是作为抽象方法存在的,后者不是,JDK ...

  3. Java:利用java Timer类实现定时执行任务的功能

    一.概述 在java中实现定时执行任务的功能,主要用到两个类,Timer和TimerTask类.其中Timer是用来在一个后台线程按指定的计划来执行指定的任务.TimerTask一个抽象类,它的子类代 ...

  4. WPF中控件ListView和DataGrid典型属性介绍

    ListView GridView View视图 重要属性: public bool AllowsColumnReorder 获取或设置一个值,该值指示 System.Windows.Controls ...

  5. C#的事件处理机制

    链接地址:http://blog.csdn.net/niuox/article/details/7527876 在以往的关于事件处理的程序中,我们更多的是采用一种循环等待的方式,即为了检测某个事件是否 ...

  6. UVA 10317 - Equating Equations (背包)

    Problem F Equating Equations Input: standard input Output: standard output Time Limit: 6 seconds Mem ...

  7. bootstrap datatable项目封装支持单选多选

    自己在开发项目是根据自己的项目后台框架封装的jquery datatable插件基本上能集成到任何项目中使用,当然封装的还不够完美,给大家学习 调侃 使用介绍:query_dataTable({tab ...

  8. C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)

    本节主要讲了函数重载的主要概念以及使用方法,还有C和C++的相互调用的准则和具体的工程中的使用技巧. 函数重载 1.基本概念 函数重载就是用同一个函数名来定义不同的函数.使用不同的函数参数来搭配同一个 ...

  9. jsonp与cors跨域的一些理解

    浏览器的同源策略,即是浏览器之间要隔离不同域的内容,禁止互相操作. 比如,当你打开了多个网站,如果允许多个网站之间互相操作,那么其中一个木马网站就可以通过这种互相操作进行一系列的非法行为,获取你在各个 ...

  10. 设置MyEclipse中代码的换行长度

    1.打开Preferences -> Java -> Code Style -> Formatter. 2.选择Edit -> Line Wrapping  -> Max ...