本人做了一个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. oracle 表复制

    1. 复制表结构及其数据: create table table_name_new as select * from table_name_old 2. 只复制表结构: ; 或者 create tab ...

  2. 有关oppo蝴蝶解锁的三D技术

    oppo手机的界面设计也是很漂亮的.在很多界面中使用了3D技术塑造出了大量华丽的效果.在蝴蝶解锁中使用了两个对称的三D变幻,宛如蝴蝶翅膀上美丽的花纹.在受到用户点击后,随风缓慢上下扇动,充满浪漫的动感 ...

  3. Python 对Twitter中指定话题的被转载Tweet数量的频谱分析

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-10 @author: guaguastd @name: r ...

  4. Java基础05 实施接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...

  5. isotope/masonry 使用jQuery.sortable

    function goMasonry() { // if ($container.data('masonry') != undefined) { $container.isotope('destroy ...

  6. could not create the java virtual machine(转)

    打开不了myeclipse,报错“could not create the java virtual machine”,解决问题过程如下: 1.在D:\MyEclipse\eclipse有个eclip ...

  7. sql和shell注入测试

    1.整数型参数,必须intval转义,用addslashes转义不行 <?php   $test = $_REQUEST["test"]; $test = addslashe ...

  8. Swift - 使用CGBlendMode改变UIImage颜色

    类似于PS,Swift中也可对图片UIImage进行图层混合(blending),而且提供了相当丰富的混合模式(blendMode).本文先介绍使用其中的kCGBlendModeDestination ...

  9. tomcat加载时报The web application [/dmscs] created a ThreadLocal with key of type

    严重: The web application [/dmscs] created a ThreadLocal with key of type [com.opensymphony.xwork2.inj ...

  10. Linux chmod权限管理需要小心的地方

    档案的权限管理和简单,比如chmod 775 /tmp/test.sh 另外使用chmod +w /tmp/test.sh,会给档案的拥有者,群组,其他人的权限都加上了可编辑.这样就有安全隐患了.所以 ...