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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值