delphi7+ nativexml开发,如何将XML文档(格式固定)进行类化?
XML文档格式(简化)如下:<?xml version="1.0" encoding="GB2312"?>
<DSDOC SORT="公共" DATA="">
<HEADER SOFTWAREID="2011" >
<DATA NAME="Qabc" VER="1.00" DATE="0"/>
<DATA NAME="iLIKEcl" VER="1.00" DATE="0"/>
</HEADER>
<PASS><![CDATA[9ArMO1gjC2+6x42vggWLCDsVLema3YrXv8Z01gY3]]></PASS>
<TProject COSTTYPE="清单" RATETYPE="2011">
<PROJCHA></PROJCHA>
<ITEMS>
<TSubProject EXPANDED="1">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
<TSubProject EXPANDED="2">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
</ITEMS>
</TProject>
</DSDOC>有哪位能将类化后的单元文件,贴 上来一下。
还有,生成类后,是不是还有一个载入XML DOC文档的函数呢?利用这个类如何生一个XML DOC文档呢?附:
我现在用的NativeXml是3.26版,如下
{$ifndef D12up}
type
UnicodeString = WideString;
RawByteString = AnsiString;
{$endif}const // Current version of the NativeXml unit
cNativeXmlVersion = 'v3.26';--------
// Forward declaration of TNativeXml
TNativeXml = class; // TXmlNode is the ancestor for all nodes in the xml document. See TsdElement
// for the elements, TsdAttribute for the attributes.
TXmlNode = class(TDebugPersistent)
private
// inherited from TDebugPersistent: FOwner: TDebugComponent
FParent: TXmlNode;
......
XML文档格式(简化)如下:<?xml version="1.0" encoding="GB2312"?>
<DSDOC SORT="公共" DATA="">
<HEADER SOFTWAREID="2011" >
<DATA NAME="Qabc" VER="1.00" DATE="0"/>
<DATA NAME="iLIKEcl" VER="1.00" DATE="0"/>
</HEADER>
<PASS><![CDATA[9ArMO1gjC2+6x42vggWLCDsVLema3YrXv8Z01gY3]]></PASS>
<TProject COSTTYPE="清单" RATETYPE="2011">
<PROJCHA></PROJCHA>
<ITEMS>
<TSubProject EXPANDED="1">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
<TSubProject EXPANDED="2">
<RESVALUESET>
<DATA FLAG="RGF" VALUE="15" />
<DATA FLAG="All" VALUE="10" />
</RESVALUESET>
</TSubProject>
</ITEMS>
</TProject>
</DSDOC>有哪位能将类化后的单元文件,贴 上来一下。
还有,生成类后,是不是还有一个载入XML DOC文档的函数呢?利用这个类如何生一个XML DOC文档呢?附:
我现在用的NativeXml是3.26版,如下
{$ifndef D12up}
type
UnicodeString = WideString;
RawByteString = AnsiString;
{$endif}const // Current version of the NativeXml unit
cNativeXmlVersion = 'v3.26';--------
// Forward declaration of TNativeXml
TNativeXml = class; // TXmlNode is the ancestor for all nodes in the xml document. See TsdElement
// for the elements, TsdAttribute for the attributes.
TXmlNode = class(TDebugPersistent)
private
// inherited from TDebugPersistent: FOwner: TDebugComponent
FParent: TXmlNode;
......
解决方案 »
- **我想把RxRichEdit里面图文混编的内容保存到数据库里面,用什么方法最好
- 请教一个关于for的问题
- CBX RIA框架:Delphi开发BS构架/SmartClient的利器
- delphi集合数据类型的问题
- 一个关于dbgrid显示数据问题
- 怎样得到打印机当前纸装名称(如A4)?
- 如何将ADOQUERY的数据转换成DBF文件啊?或者...
- Delphi7连接Sql Server2000 用哪种连接方式最好?
- 小弟我希望把delphi学得深一点,请各位高手帮忙!
- 动态生成adoquery需要设哪些属性?立即给分
- 如何旋转WMF文件90度
- 如何把grideh选中的多条记录作为一个数据集赋值给自己定义的一个数据集?
需要生成源代码参与编译,多麻烦啊。。所以楼上有人说要用脚本其实,实现一个类,按名从xml里取值(如果需要,加上能写值的功能),就行了!
这样的一个类是通用的,变的只是xml这个数据内容而已
如果类化,类也要随着xml的结构变化而变化,才是麻烦
类化,开发时较方便 。
所以要类化。
sl.name['Caption']:='值'; sl.name['XXXX']:='XX';这样描述下去不就是一个简单类吗如果如果存在对象层次可以通过 SL.ADDOBJECT('Child',object);
实现
实在不行自己定义一个 列表类,通过XML的循环类似添加
键值列表取代 完全可以 表达一个复杂的xml的
这个我专门用ini实现过的:多层次、重复 都能够存储
这个东西,我的做法就是一个通用的解释类,把xml或ini当成一个大数据域就行了
当然,这样做的前提是 按名存取 的速度 要与 按类/结构取域 的速度差不多
xml可能就会差多了,ini则真的是差不多
unit UntClassDef;interfaceuses
Windows, Classes, SysUtils, Parser, Dialogs, IdGlobal, StrUtils,
IniFiles, Graphics, Forms, DB, ADODB, Gauges, Variants, NativeXML;const
//节点名
xmlDocRootNodeName = 'HYMAKEESTDOC'; //文档的根名称
xmlHEADERNodeName = 'HEADER';
xmlDATANodeName = 'DATA';
xmlPASSNodeName = 'PASS';
xmlTProjectNodeName = 'TProject';
//以下各节点都是 'TProject' 的子节点
xmlPROJCHANodeName = 'PROJCHA';
xmlITEMSNodeName = 'ITEMS';
//以下各节点都是 'ITEMS' 的子节点
xmlITEMSNodeName = 'TSubProject';
xmlITEMSNodeName = 'RESVALUESET';type
TMyNode = class(TXmlNode)
private
//Get,Set 方法,要写哪些?
public
//这里写什么呢? published
//这里写什么呢?
end; TXMLHYMAKEESTDOCType = class;
THEADER = class;
THeaDataList=class;
THeaDATA = class;
TPASS = class;
TProjectItem = class;
TPROJCHA = class;
TSubProject=class;
TRESVALUESET=class;
TRESVALUESETList=class;
TRESVALUESETItem=class;
TITEMS=class;{ TXMLHYMAKEESTDOCType } //根节点的类 TXMLHYMAKEESTDOCType = class(TMyNode)
protected
function GetSORT: WideString;
function GetDATA: WideString;
function Get_HEADER: THEADER; //子节点
function Get_PASS: WideString; //子节点
function Get_TProject: TProjectItem; //子节点
procedure SetSORT(const Value: WideString);
procedure SetDATA(const Value: WideString);
procedure Set_PASS(const Value: WideString);
public
//构造函数
constructor Create(ADocument: TNativeXml);override;
//析构函数
destructor Destroy; override;
end;......implementationfunction LoadXmlDOC(const FileName: WideString):TXML...... ;
//这里应该还有一个载入XML文档的函数,要怎么写呢?
..............
{ TPass }constructor TPass.Create(ADocument: TNativeXml);
begin
inherited;
Name := xmlPASSNodeName; //上面定义的常量
end;destructor TPass.Destroy;
begin inherited;
end;function TPass.GetPASS: String;
begin
Result := AttributeByName['PASS'].Value;
end;procedure TPass.SetPASS(const Value: String);
var
Index: Integer;
begin
Index := AttributeIndexByname('PASS');
//Value:=[XmlDoc.NodeNewTextType('CDATA1', Value, xeCData)];
if Index > -1 then
AttributeValue[Index] := Value
else
AttributeAdd('PASS', Value);
end;...................
整个类要怎么完整的写?
......
THeaderItem = class(TCollectionItem)
private
FName : WideString;
FVer : String;
FDate : String;
published
property NAME : WideString read FName write FName;
property VER : String read FVer write FVer;
property Date : String read FDate write FDate;
end; THeader = class(TCollection)
private
FID : String;
FName : WideString;
function GetItem(Index : Integer) : THeaderItem;
public
function Add : THeaderItem;
property DATA[Index : Integer] : THeaderItem read GetItem;
published
property SOFTWAREID : String read FID write FID;
property NAME : Widestring read FName write FName; end; TDSDoc = class(Tpersistent)
private
FSort : WideString;
FData : WideString;
FHeader : THeader;
public
constructor create;
published
property SORT : WideString read FSort write FSort;
property DATA : WideString read FData write FData;
property HEADER : THeader read FHeader write FHeader;
end; ....
PS Code above is just to give you heads up on how you can implement your requirements. For methods to read and/or save the object to/from XML, take a look at NativeXmlObjectStorage.pas that comes with NativeXML package. Especially the methods ObjectLoadFromXmlFile and ObjectSaveToXmlFile.But I believe you will have to write your own methods as you needn't to use RTTI since you already know the structure of XML + Object.Hope it helps.//Ali