如何将XML格式的字符串导入DataSet中 ( 积分: 100 )

  • 主题发起人 主题发起人 tengjian1981
  • 开始时间 开始时间
T

tengjian1981

Unregistered / Unconfirmed
GUEST, unregistred user!
XMLStr:='<table><row><name>111111111</name><age>10</age><name>22222</name><age>20</age></row></table>';
然后自己创建一个DataSet将数据导入该DataSet中
 
XMLStr:='<table><row><name>111111111</name><age>10</age><name>22222</name><age>20</age></row></table>';
然后自己创建一个DataSet将数据导入该DataSet中
 
另外想再问个简单的问题,就是string格式怎么转成Stream格式???
 
1,用IXMLDocument来解释吧
2,可以用TStringStream

var
strs: TStreamStream;
begin
strs := TStreamStream.Create('ssssss');
 
高手都哪去了?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
 
1、如果你的XML文件是通过DataSet导出的标准XML文件,则可以直接使用ADOQuery.LoadFromFile;
2、由于你的XML格式是自定的,ADO数据集控件(或TClientDataSet)无法解析,故需要自行解析,下面是根据你提供的xml字符串写的解析代码。
==================================================================
首先,你的XML字符串不好处理,改成以下,为了直观,分行写:
<table>
<row>
<name>111111111</name>
<age>10</age>
</row>
<row>
<name>22222</name>
<age>20</age>
</row>
</table>

解析可以自己直接处理字符串,比较麻烦,我这里使用TXMLDocument来帮助解析,再详细处理其中的节点,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
RowNode:IXMLNode;
NameNode:IXMLNode;
AgeNode:IXMLNode;
begin
ADODataSet1.Close;
ADODataSet1.CreateDataSet;
with XMLDocument1 do
begin
XML.LoadFromFile('c:/test.xml');
Active:=True;
RowNode:=XMLDocument1.ChildNodes.First.ChildNodes.FindNode('row');
while RowNode<>nil do
begin
NameNode:=RowNode.ChildNodes.FindNode('name');
AgeNode:=RowNode.ChildNodes.FindNode('age');
if NameNode<>nil then
begin
ADODataSet1.Append;
ADODataSet1.FieldByName('name').AsString:=NameNode.Text;
if AgeNode<>nil then
ADODataSet1.FieldByName('age').AsString:=AgeNode.Text;
end;
RowNode:=RowNode.NextSibling;
end;
end;
end;
注意:ADODataSet1中需要事先建立两个固定字段name与age;
 
To:smokingroom
请问XMLDocument1是个什么控件?
我试了一下报错。


另外我之前试了一种方法:
var
myDataSet:TClientDataSet;
XMLStr:string;
XMLStream:TStringStream;
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);
myDataSet.LoadFromStream(XMLStream);
Form2.QuickRep1.DataSet:=myDataSet;
Form2.QRDBText1.DataSet:=myDataSet;
Form2.QRDBText1.DataField:='name';
Form2.QRDBText3.DataSet:=myDataSet;
Form2.QRDBText3.DataField:='age';
Form2.QuickRep1.Preview;
end;

上面的方法刚开始不报错试验成功,后来我怎么写都报错:错误信息为“Variant or safe array is locked”
如果你知道还望指教
 
等待高手出现[:(]
 
大富翁真的没高手呢吗?这个问题都没人回答啊
 
var
XMLStr:String;
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>';
ClientDataSet1.XMLData := XMLStr;
end;
 
多人接受答案了。
 
后退
顶部