100分,讨论有关delphi下使用xml(100分)

  • 主题发起人 东海小小
  • 开始时间

东海小小

Unregistered / Unconfirmed
GUEST, unregistred user!
最近,听一个客户说他们的网站使用com什么的作接口,让客户可根据他们提供的xml结构接口
下载后台数据库数据。由于没有高过xml,我想知道这些实现的流程细节,有那位老兄
可以指教以下,分数大大的有,不够再加。
再描述问题细节:
1。服务器怎样把数据库的内用转换成xml结构,有以什么协议发放这些数据
2。客户怎么利用这些提供的xml结构接口,从服务器段接收xml技术。
3。客户接收到的数据怎么从xml中解析出来的。
4。用delphi什么组件,怎么实现的。
问题有点多,不好意思。
我想肯定有不少人想弄明白delphi下怎么快速利用xml这个问题。
原高手赐教。分数好商量。
 
1.Delphi的ClientDataSet控件可以直接读取MyBase格式的XML的文件,
例程见c:/Program Files/Borland/Delphi6/Demos/Internet/XMLTransform的源程序及
XML文件。
服务器 :MyBase格式XML文件.SaveAsStream (存成流)
ClientDataSet.LoadFromStream
ClientDataSet.Insert....
ClientDataSet.Edit ...
ClientDataSet.Post ...等
将流转换为OleVariant,例程:
procedure TForm2.VariantToStream (const v : olevariant;
Stream : TMemoryStream);
var
p : pointer;
begin

Stream.Position := 0;
Stream.Size := VarArrayHighBound (v, 1) - VarArrayLowBound(v, 1) + 1;
p := VarArrayLock (v);
Stream.Write (p^, Stream.Size);
VarArrayUnlock (v);
Stream.Position := 0;
end;

procedure TForm2.StreamToVariant (Stream : TMemoryStream;
var v : OleVariant);
var
p : pointer;
begin

v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock (v);
end;

2。客户端接收OleVariant变量,利用上面的例程将OleVariant转达换为流
3。客户端用ClientDataSet.LoadFromStream装载流,这样就可以当成数据表进行操作了
4。关键技术是MyBase格式的XML,OleVariant与流的转换
 
谢谢高兄,咱们继续。分数很快会给你
 
高小五兄,能不能有不用clientdataset而用adotable或table对接收过来的数据进行操作的
可能,例如。。。?
麻烦你了!
 
因为Adotable存成的XML文件与Borland的Mybase格式不同,而
客户端又不能用Ado只能用ClieatDataset,所以只能采用这种方式,
您可以在服务器端将AdoTable的数据存到服务器端的ClientDataset(
在服务器的数据模块中也要放Clientdataset,)中,然后传到客户端。
我就是这么干的。
 
看来暂时没办法了,我们看看其他人还有什么看法吗。明天上午9:30给你分。
非常感谢!
 
谢谢高兄
 
高兄,为什么我用VariantToStream 这段代码时,老是报:invalid argument!
help!
 
Stream要创建。
var
ms : TMemoryStream ;
aa : Olevariant ;
begin
ms := TMemoryStream.Create ;
VariantToStream(aa,ms) ;
ClientDataSet1.LoadFromStream(ms) ;
ms.Free ;
end ;
 
stream是创建的,错误出在varianttostream过程中p:=vararraylock(v)这里,报错:
invalid argument(无效的参数)。编译时通过,只是在触发varianttostream这个过程时,报错。
虽然现在我用文件交换替代了这个发放,解决了问题,但总是心不甘。
我在d6,d7(在不同地机器上)下都试过,每次都在触发时报错。
高兄,帮帮我。
下面是我的测试代码。
procedure tform1.v_to_s(const data:eek:levariant;
var stre:tmemorystream);
var
p: Pointer;
begin
p := VarArrayLock(Data);
try
Stre.Write(p^, VarArrayHighBound(Data,1) + 1);
finally
VarArrayUnlock(Data);
end;
end;

procedure TForm1.StreamToVariant (Stream : TMemoryStream;
var v : OleVariant);
var
p : pointer;
begin
v := VarArrayCreate ([0, Stream.Size - 1], varByte);
p := VarArrayLock (v);
Stream.Position := 0;
Stream.Read (p^, Stream.Size);
VarArrayUnlock (v);
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
var xmlobj : oleVariant;
i,count : integer;
list : tlistitem;
st : tmemorystream;
begin
st:=tmemorystream.Create;
xmlobj := CreateOLEObject('MSXML2.DOMDocument');
xmlobj.async := false;
xmlobj.load('http://www.delphibbs.com/delphibbs/rooms.asp');
memo1.Text :=xmlobj;
//xmlobj.Save('room.xml');

form1.v_to_s(xmlobj.data,st) ;
//报错
//xmlobj := unAssigned;
{ xmldocument1.LoadFromFile('room.xml');
count:=xmldocument1.DocumentElement.ChildNodes.Count;
caption:=xmldocument1.ChildNodes['DFWML'].AttributeNodes['type'].Text;
for i:=0 to count-1do
begin
list:=listview1.Items.Add;
list.Caption:=xmldocument1.DocumentElement.ChildNodes.Text;
list.SubItems.Add(xmldocument1.DocumentElement.ChildNodes.AttributeNodes[0].text);
end;
}
end;
 
procedure VariantToFile(FileName: String;
var AVariant: OleVariant);
var
AStream: TFileStream;
MyBuffer: Pointer;
Size: Integer;
begin

AStream:=TFileStream.create(FileName,fmCreate);
try
aStream.Seek(0, soFrombegin
ning);
Size:=VarArrayHighBound(AVariant,1)+VarArrayLowBound(AVariant,1)+1;
MyBuffer:=VarArrayLock(AVariant);
AStream.WriteBuffer(MyBuffer^, Size);
VarArrayUnlock(AVariant);
finally
AStream.Free;
end;

end;

function FileToVariant(FileName: String): OleVariant;
var
AStream: TFileStream;
MyBuffer: Pointer;
begin

AStream:=TFileStream.create(FileName,fmOpenRead);
try
aStream.Seek(0, soFrombegin
ning);
Result:=VarArraycreate([0, AStream.size-1], VarByte);
MyBuffer:=VarArrayLock(Result);
AStream.ReadBuffer(MyBuffer^, AStream.Size);
VarArrayUnlock(Result);
finally
AStream.Free;
end;

end;

//xmlobj的格式必须从FileToVariant获得,
//xmlobj必须是一个variant数组
//我在应用中采用StreamtoVariant与VariantToStream成对出
//现,所以没有意识到这个总题,一个单纯的OleVariant转化
//为Stream没有意义。
//在服务器端调用先想办法将数据存成Stream,
//然后用 StreamtoVariant 转化为Varieant传到客户端
//客户端用VariantToStream,这样两个调用成对出现
procedure TForm1.Button2Click(Sender: TObject);
var
xmlobj : OleVariant;
begin
xmlobj := FileToVariant('c:/windows/desktop/pos.xml') ;
VariantToFile('c:/windows/desktop/pos1.xml',xmlobj) ;
end;
 
谢谢高兄。非常感谢。只是不能再给分了。抱歉。
 
我今天发现如果OleVariant为空,则会出现“错误参数”提示
 
高兄:我也有发现,但当时想:variant可以在string之间转换,那因该可以为空。
只是不知它为什么不作为空处理。
最近在忙什么?
我的那个xml项目不作了,现在公司用二进制方式传送搞定。xml实在是有许多多余
信息。不利于远程快输传输。
 
请问客户端是怎么接受数据的?
 
to jnbutian,
能说详细些吗?
 
顶部