本人做了一个XML和对象属性互转的基类,现在放上来有兴趣拿去看一下,用法很简单,声明一个BaseConversion的子类,该子类与你想转换的对象相对应,然后覆盖基类的两个虚方法,然后在里面写元素与对象属性的转换即可以,废话少说了,还是看代码了,例子也懒得去写了,相信不会很难看懂的:
unitXMLConversion;
{*******************************************
*brief:XML和对象属性的转换
*autor:linzhenqun
*date:<chsdate w:st="on" isrocdate="False" islunardate="False" day="26" month="10" year="2005">2005-10-26</chsdate>
*email:linzhengqun@163.com
*blog:http://blog.youkuaiyun.com/linzhengqun
********************************************}
interface
uses
Classes,SysUtils,xmldom,XMLIntf,oxmldom,XMLDoc;
Type
TBaseConversion=class
protected
FXMLDoc:TXMLDocument;
(*在ParenElem元素下增加一个子元素*)
functionAppendChildElement(constTagName,Value:WideString;
ParenElem:IDOMElement):IDOMElement;
(*根据TagName取得XML节点下的某一个子节点*)
functionGetSingleEleByTagName(AEle:IDOMElement;TagName:WideString):IDOMElement;
(*取得XML节点的文本*)
functionGetElementText(AElement:IDOMNode):WideString;
(*IDOMElement的text值转换成各种类型的数据,
如果AElem=nil或者text不符合某些数据类型,返回Default值*)
functionEleTextToBoolDef(AElem:IDOMElement;constDefault:Boolean):Boolean;
functionEleTextToStrDef(AElem:IDOMElement;constDefault:WideString):WideString;
functionEleTextToIntDef(AElem:IDOMElement;constDefault:Integer):Integer;
functionEleTextToFloatDef(AElem:IDOMElement;constDefault:Extended):Extended;
(*取得IDomElement的属性的值,并转换成各种类型
如果不符合数据类型,返回Default值*)
functionEleAttrToBoolDef(AElem:IDOMElement;AttrName:WideString;
constDefault:Boolean):Boolean;
functionEleAttrToStrDef(AElem:IDOMElement;AttrName:WideString;
constDefault:WideString):WideString;
functionEleAttrToIntDef(AElem:IDOMElement;AttrName:WideString;
constDefault:Integer):Integer;
functionEleAttrToFloatDef(AElem:IDOMElement;AttrName:WideString;
constDefault:Extended):Extended;
procedureObjPropertyToElements(Obj:TObject);virtual;
procedureElementsToObjProperty(Obj:TObject);virtual;
public
procedureXMLToObjProperty(XMLStream:TStream;Obj:TObject);
procedureObjPropertyToXML(XMLStream:TStream;Obj:TObject);
constructorCreate;
destructorDestroy;override;
end;
implementation
{TBaseConversion}
functionTBaseConversion.AppendChildElement(constTagName,
Value:WideString;ParenElem:IDOMElement):IDOMElement;
var
Text:IDOMText;
begin
Result:=FXMLDoc.DOMDocument.createElement(TagName);
ifValue<>''then
begin
Text:=FXMLDoc.DOMDocument.createTextNode(Value);
Result.appendChild(Text);
end;
ParenElem.appendChild(Result);
end;
constructorTBaseConversion.Create;
var
Vendor:TDOMVendor;
begin
FXMLDoc:=TXMLDocument.Create(nil);
//下面这几句代码可以去掉,则将使用MSXML来解析
//现在是用OpenXML的原生代码解析
Vendor:=DOMVendors.Find('OpenXML');
ifVendor<>nilthen
FXMLDoc.DOMVendor:=Vendor;
end;
destructorTBaseConversion.Destroy;
begin
FXMLDoc.Free;
inherited;
end;
functionTBaseConversion.EleAttrToBoolDef(AElem:IDOMElement;AttrName:WideString;
constDefault:Boolean):Boolean;
var
LNode:IDOMNode;
begin
Result:=Default;
ifAElem<>nilthen
begin
LNode:=AElem.attributes.getNamedItem(AttrName);
ifLNode<>nilthen
Result:=StrToBoolDef(LNode.nodeValue,Default);
end
end;