本人做了一个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. [转]php连接postgresql

    首先推荐一下postgres数据库,免费,强大,甚至某些方面比商业数据库还要好,大家可以试试. 安装: 附安装图解(网上找的):http://blog.sina.com.cn/s/blog_5edb7 ...

  2. 使用Spring标签库

    A.Spring标签库 Web项目若使用Spring Web MVC并使用JSP作为表现的话.从Spring2.0版本开始提供一套标签库可供使用. 使用标签库无非是易于开发,维护之类云云.这里就不阐述 ...

  3. Jquery学习笔记:操作form表单元素之一(文本框和下拉框)

    一.概述 在web页面开发中,经常需要获取和设置表单元素的值(如文本框中的内容),特别是在ajax应用中,更是常态.本文系统的介绍下如何操作. 同操作其它html元素一样,操作的过程差不多. 第一步, ...

  4. java web从零单排第二十一期《Hibernate》主键的生成方式,用户增加与显示用户列表

    1.新建register.jsp <%@ page language="java" import="java.util.*" pageEncoding=& ...

  5. Flex中怎么给表格中的滚动栏定位

    1.问题背景 假设表格中的字段过多,会出现滚动栏,在将滚动栏滚到一定的位置时,又一次刷新表格.滚动栏会回到原处,原来查看的字段还得继续滚动,才干查看到. 2.实现实例 <? xml versio ...

  6. 【linux】arm mm内存管理

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  7. 总线接口与计算机通信(五)CAN总线

        CAN网络图示     CAN的特点      CAN协议具有以下特点.      (1) 多主控制  在总线空闲时,所有的单元都可开始发送消息(多主控制). 最先访问总线的单元可获得发送权( ...

  8. string和byte[]的转换 (C#)

    原文 string和byte[]的转换 (C#) string类型转成byte[]: byte[] byteArray = System.Text.Encoding.Default.GetBytes  ...

  9. Charles_N:HTTP请求响应监听工具

    Charles:HTTP请求响应监听工具使用说明.doc   1.    介绍 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信 ...

  10. Android - Animation 贝塞尔曲线之美

    概述 贝塞尔曲线于1962,由法国工程师皮埃尔·贝塞尔所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计.贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算 ...