如何将一个XML文件当作数据集控件的数据源实现对XML文件的检索? (50分)

H

hb207

Unregistered / Unconfirmed
GUEST, unregistred user!
现在我需要在delphi5的程序中对一个XML文件的数据进行检索,请问可不可以通过ADO的数据集控件
实现这个功能(即将XML文件当作数据源),具体如何实现?(我试过用ADODataSet,但
不知道如何设置ConnectionString,CommandText等属性,将CommandText属性设为一个XML
文件时,激活ADODataSet时会出错“源XML不完整或无效”,但那个XML文件是可以用IE
正常浏览的),请指教。谢谢!(注:我用的是delphi5)
 
用adotable.loadfromfile('aaa.xml')
然后就像平时操作一样就可以了,操作完以后POST,然后在adotable.SaveToFile('aaa.xml', pfXML);
 
请问flintsoft,adotable的数据源(ConnectionString)怎么设置?
 
既然是从文件LOAD的,就不用数据源了,不需要设置ConnectionString
不过要在LOAD前和SAVE后关闭,并将整个操作放到一个TRY里,例如:这个例子是修改的,其他的
像insert和搜索的和平时操作是一样的。
try
TempName := ExtractFileDir(Application.ExeName) + '/test.xml';
adotbXMLData.Close;
adotbXMLData.LoadFromFile(TempName);
if adotbXMLData.RecordCount > 0 then
begin
adotbXMLData.First;
for j := 0 to adotbXMLData.RecordCount - 1do
// Iterate
begin
adotbXMLData.Edit;
adotbXMLData.FieldByName('ID').AsInteger := 1;
adotbXMLData.FieldByName('UserName').AsString := 'test';
adotbXMLData.Post;
adotbXMLData.Next;
end;
// for
adotbXMLData.SaveToFile(TempName, pfXML);
ShowMessage('修改成功!');
end;
finally // wrap up
adotbXMLData.Close;
end;
// try/finally
 
谢谢你看了我的问题。我按照你所说的,加了一个ADOTABLE,代码如下:
try
adotbXMLData.Close;
adotbXMLData.LoadFromFile('d:/test.xml');
……
finally
adotbXMLData.Close;
end;

但执行到LoadFromFile('d:/test.xml')时出以下错误:
[Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序
注:该xml文件是存在而且合法的。请问是不是还应该设定ADOTABLE的什么属性?
请指教,谢谢!(注:我用的是delphi5)
 
哦,可能是因为ADO导入的XML需要一定的格式。
你可以用ADO调用一个正常的数据集,然后将这个数据集保存成XML文件,然后再对比一下这个
由DELPHI生成的XML和一般格式的XML有什么区别。
要不你就将你的XML改成和这个格式一样,要不就用节点的方式操作XML,DELPHI6里有操作XML的控件。
 
[:)]
不是所有能在IE里正常显示的XML文件都能被ADOTable Load的。
你得声明命名空间和Schema,看看AdoTable1.SaveToFile('C:/temp.xml',pfXML);的结果
[blue]
- <xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
- <s:Schema id="RowsetSchema">
- <s:ElementType name="row" content="eltOnly" rs:updatable="true">
- <s:AttributeType name="id" rs:number="1" rs:writeunknown="true"
rs:basecatalog="sse" rs:basetable="test" rs:basecolumn="id"
rs:keycolumn="true">
<s:datatype dt:type="int" dt:maxLength="4" rs:precision="10"
rs:fixedlength="true" rs:maybenull="false" />
</s:AttributeType>
- <s:AttributeType name="name" rs:number="2" rs:nullable="true"
rs:writeunknown="true" rs:basecatalog="sse" rs:basetable="test"
rs:basecolumn="name">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="10"
rs:fixedlength="true" />
</s:AttributeType>
<s:extends type="rs:rowbase" />
</s:ElementType>
</s:Schema>
- <rs:data>
<z:row id="1" name="陈真" />
<z:row id="2" name="霍元甲" />
<z:row id="3" name="流氓一" />
</rs:data>
</xml>
[/blue]
 
D6的ClientDataSet也提供了使用XML的功能。糟糕的是ClientDataSet于ADODataSet使用
XML的格式不同,如何解决?
 
多人接受答案了。
 
顶部