如何将XML格式的字符串导入ClientDataSet中

tengjian1981 2005-06-10 11:27:31
之前已经问过这个问题,在启示下自己试验成功,不知道跟原来一样为什么现在报错?
代码如下:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
myDataSet:TClientDataSet;
XMLStr:string;
XMLStream:TStringStream;
Xml:TXMLDocument;
begin
XMLStr:='<?xml version="1.0" standalone="yes"?><DATAPACKET Version="2.0"><METADATA>'
+'<FIELDS><FIELD attrname="name" fieldtype="string" WIDTH="10"/><FIELD attrname="age" fieldtype="string" WIDTH="10"/>'
+'</FIELDS><PARAMS CHANGE_LOG="1 0 4 2 0 4"/></METADATA><ROWDATA><ROW RowState="4" name="張三" age="aAAA"/>'
+'<ROW RowState="4" name="李四" age="BBBBBBB"/></ROWDATA></DATAPACKET>';

XMLStream:=TStringStream.Create(XMLStr);
myDataSet := TClientDataSet.Create(Form2);
try
begin
myDataSet.LoadFromStream(XMLStream); //就是这句报错,以前没有的
end;
except
end;

end;


高手能否来指导一下,真是不胜感激,或者给出别的方法来实现,分不是问题,我的qq是5542003,邮箱:tengjian1981@eyou.com希望高手赐教
...全文
483 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdqhlyf 2005-08-17
  • 打赏
  • 举报
回复
gz
tengjian1981 2005-06-16
  • 打赏
  • 举报
回复
TO: LuYang(爱心)
XML的格式必须正确,就是按我上面给出的样式。
报错肯定是XML字符拼错了,这个函数我已经用了好多地方都没有出错。,另外可以扩展一下将'row'作为这个函数的参数,那样就更灵活了。
mqjshanghai 2005-06-14
  • 打赏
  • 举报
回复
帮你顶下,大哥给我5分,我要求不高
angelior 2005-06-13
  • 打赏
  • 举报
回复
学一招

UP
helodd 2005-06-13
  • 打赏
  • 举报
回复
up
LuYang 2005-06-13
  • 打赏
  • 举报
回复
报错提示是什么,是xml 的format有问题吗?

如果你里面有中文,建议加上<?xml version="1.0" standalone="yes" encoding="gb2312"?>
fansnaf 2005-06-13
  • 打赏
  • 举报
回复
学习
gg137zeus 2005-06-13
  • 打赏
  • 举报
回复
up
tengjian1981 2005-06-13
  • 打赏
  • 举报
回复
哈哈,我终于搞定了不过是换了种可能比较烦琐方法,跟大家分享一下吧。

下面我写了一个公用函数:

uses XMLDoc, XMLIntf,msxml,msxmldom;


function XMLToDataSet(strXML:WideString):TClientDataSet;
var
myDataSet:TClientDataSet;
s:string;
xdoc : IXMLDOMDocument;
xdn :IXMLDOMNode;
xdns :IXMLDOMNodeList;
i,j:integer;
begin
s:='<?xml version="1.0" encoding="gb2312"?> <!--文档版本信息, 注释格式同HTML-->'
+'<data>'
+'<row>'
+'<id>11</id><name>AAA</name><sex>男9</sex><age>24</age>'
+'</row>'
+'<row>'
+'<id>12</id><name>BBB</name><sex>女8</sex><age>25</age>'
+'</row>'
+'<row>'
+'<id>13</id><name>CCC</name><sex>女7</sex><age>26</age>'
+'</row>'
+'<row>'
+'<id>4</id><name>DDD</name><sex>男6</sex><age>28</age>'
+'</row>'
+'</data>';
//上面的格式就是传递参数strXML:WideString的格式,必须用row节点
myDataSet := TClientDataSet.Create(nil);
xdoc:=CreateDOMDocument();
xdoc.loadXML(StrXML);
//xdoc.load('c:\test.xml');
s:='';
xdn:=xdoc.documentElement;
xdns:=xdoc.selectNodes('//row');
try
begin
for i:=0 to xdns.item[0].childNodes.length-1 do
begin
myDataSet.FieldDefs.Add(xdns.item[0].childNodes[i].nodeName,ftstring,1000);
end;
myDataSet.CreateDataSet; //建立
myDataSet.Active;

for i:=0 to xdns.length-1 do
begin
myDataSet.Append;
for j:=0 to xdns.item[i].childNodes.length-1 do
begin
myDataSet.FieldValues[xdns.item[i].childNodes[j].nodeName]:=xdns.item[i].childNodes[j].text;
end;
myDataSet.Post;
end;

end;
except
on Ex:Exception do
//ShowMessage(Ex.Message);
myDataSet:=nil;
end;

result:=myDataSet;

end;
creativepeter 2005-06-10
  • 打赏
  • 举报
回复
To tengjian1981 (+U2005):
我用你的代码测试怎么没有报错,能否将报错提示贴出来瞧瞧呢?
tengjian1981 2005-06-10
  • 打赏
  • 举报
回复
To:creativepeter(头皮屑)
不好意思的确没错,是我的Delphi出问题了,我重装了Delphi就好了。
可是我还是不知道:<PARAMS CHANGE_LOG="1 0 4 2 0 4"/>是干什么的,这个参数好象还没有什么规律,你知道吗?


因为我的XML格式的字符串是从c#转过来的,样式是这样的:
<Table>
<Row>
<Name>张三</Name><Age>21</Age>
</Row>
<Row>
<Name>李四</Name><Age>23</Age>
</Row>
</Table>

象这样的字符串怎么导如DataSet?

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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