本人做了一个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. JavaScript 字符串编码函数

    JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...

  2. 自定义类似QMutexLocker的CMutexLocker

    最近做项目遇到一个需求,有一个buttonSlot()执行要耗点时间,为了防止用户无限制的乱点出现问题,考虑加一个互斥锁,使得每次执行完后才允许执行下一次.大概意思是: //QMutex  m_mut ...

  3. android一个页面上多个listview

    android一个页面上多个listview,在滚动的时候,需要两个listview能够一起滚动,看起来是一个view. 这个功能的具体实现,参考: http://blog.csdn.net/xia2 ...

  4. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述

    上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...

  5. 教你看懂C++类库函数定义之一---HRESULT 宏

    一切从一个C++ 类库头文件开始,现在在做一个C++的项目,期间用到一个开源的界面库DUILib(类似MFC),这个东西还不错能很容易的写出漂亮的界面,比如QQ的界面,可以去下载下来研究研究,地址:h ...

  6. What’s new in Spark 1.2.0

    What's new in Spark 1.2.0 1.2.0 was released on 12/18, 2014 在2014年5月30日公布了Spark 1.0 和9月11日公布了Spark1. ...

  7. forEach嵌套循环的问题

    程序中: List firstList = ; i<firstList.size(); i++) { List secondListList = request.setAttribute(&qu ...

  8. Android 程式开发:(廿二)服务 —— 22.1 自定义服务

    服务,就是跑在后台的“程序”,不需要和用户进行交互.举个例子,当使用一款应用的时候,可能同时想在后台播放一些音乐.在这种情况下,后来播放音乐的代码不需要和用户进行交互,所以,它就可能被当成一个服务.当 ...

  9. JSP页面小脚本实现日期比較,Java同理,精简过后的,可能在效率上不太好,有大大能够给优化下就更好了

    <%         java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd ...

  10. 零积分下载,2014年辛星mysql教程秋季版第一本已经完工,期待您的支持

    经过一段时间的不懈努力.终于,2014年辛星mysql教程秋季版的第一本,即夯实基础已经完工,在csdn的下载地址为:去下载地址 ,假设左边地址跪了,能够去http://download.csdn.n ...