delphi7+ nativexml开发

solonet 2011-04-14 11:12:54
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;
......

...全文
838 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiyaaihai 2013-08-12
  • 打赏
  • 举报
回复
请问各位大虾,哪里能下载SimDesign NativeXml的控件包,能够指导一下,刚开始学,有点懵
solonet 2011-04-18
  • 打赏
  • 举报
回复
调试不成功。
solonet 2011-04-16
  • 打赏
  • 举报
回复
Thank you ,AliNaqvi
Ali 2011-04-16
  • 打赏
  • 举报
回复
I think you can follow below approach to define a layer for xml data binding yourself.


......
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
solonet 2011-04-15
  • 打赏
  • 举报
回复
项目要求不用 IXMLDOCOMENT ,改用 NativeXml 控件,所以不用 xml mapper
「已注销」 2011-04-15
  • 打赏
  • 举报
回复
xml mapper
solonet 2011-04-15
  • 打赏
  • 举报
回复

unit UntClassDef;

interface

uses
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;

......

implementation

function 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;

...................
整个类要怎么完整的写?

风之谷 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 solonet 的回复:]

楼上的老大,能不能按XML结构写个调用 的例子呢?谢谢啦
[/Quote]
------------------
米有时间改天吧
solonet 2011-04-14
  • 打赏
  • 举报
回复
楼上的老大,能不能按XML结构写个调用 的例子呢?谢谢啦
风之谷 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sz_haitao 的回复:]

引用 10 楼 jiap1723 的回复:
如果是简单类的话

完全可以用 键值列表取代

无非就是属性---对值

如果存在子属性 或者 数组

那么大不了定义一个 单项列表类 完全可以满足需求


键值列表取代 完全可以 表达一个复杂的xml的
这个我专门用ini实现过的:多层次、重复 都能够存储
这个东西,我的做法就是一个通用的解释类,把xml或ini当成一个大……
[/Quote]

嗯 我的想法和你差不多

我也做过类似的东西,不过是一个单向列表

haitao 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jiap1723 的回复:]
如果是简单类的话

完全可以用 键值列表取代

无非就是属性---对值

如果存在子属性 或者 数组

那么大不了定义一个 单项列表类 完全可以满足需求
[/Quote]

键值列表取代 完全可以 表达一个复杂的xml的
这个我专门用ini实现过的:多层次、重复 都能够存储
这个东西,我的做法就是一个通用的解释类,把xml或ini当成一个大数据域就行了
当然,这样做的前提是 按名存取 的速度 要与 按类/结构取域 的速度差不多
xml可能就会差多了,ini则真的是差不多
风之谷 2011-04-14
  • 打赏
  • 举报
回复
我说的不知道你是否明白

Delphi的键值列表 比如Stringlist


sl.name['Caption']:='值';

sl.name['XXXX']:='XX';

这样描述下去不就是一个简单类吗

如果如果存在对象层次

可以通过 SL.ADDOBJECT('Child',object);
实现
实在不行自己定义一个 列表类,通过XML的循环类似添加
solonet 2011-04-14
  • 打赏
  • 举报
回复
XML文档的结构较复杂,属性多,层次深
所以要类化。
风之谷 2011-04-14
  • 打赏
  • 举报
回复
感觉就是DELPHI 太老了,很多新型的技术,当初DELPHI就没考虑到,导致从OBJECT 就开始脱节。所以没办法
风之谷 2011-04-14
  • 打赏
  • 举报
回复
如果是简单类的话

完全可以用 键值列表取代

无非就是属性---对值

如果存在子属性 或者 数组

那么大不了定义一个 单项列表类 完全可以满足需求
solonet 2011-04-14
  • 打赏
  • 举报
回复
XML 结构是固定的
类化,开发时较方便 。
solonet 2011-04-14
  • 打赏
  • 举报
回复
能不能写一下,
haitao 2011-04-14
  • 打赏
  • 举报
回复
为什么要类化呢?
需要生成源代码参与编译,多麻烦啊。。。。。所以楼上有人说要用脚本

其实,实现一个类,按名从xml里取值(如果需要,加上能写值的功能),就行了!
这样的一个类是通用的,变的只是xml这个数据内容而已
如果类化,类也要随着xml的结构变化而变化,才是麻烦
风之谷 2011-04-14
  • 打赏
  • 举报
回复
其实就XML 的类映射
风之谷 2011-04-14
  • 打赏
  • 举报
回复
Delphi端定义 映射类了吗
加载更多回复(3)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧