* 难者不会·会者不难 —— 用Delphi操作XML的问题 !(200分)

  • 主题发起人 主题发起人 snowboat
  • 开始时间 开始时间
S

snowboat

Unregistered / Unconfirmed
GUEST, unregistred user!

Delphi6,用ClientDataSet读取格式简单的XML文件,希望能用SQL语句操作。
例如有这样的文件:
<dataset>
<books>
<title>Delphi大全</title>
<author>李鸿章</author>
<price>38.00</price>
</books>
<books>
<title>MIDAS速查手册</title>
<author>袁世凯</aothor>
<price>26.00</price>
</books>
</dataset>
希望能用这样的语句读取:
SELECT title FROM books WHERE price>30
最好还能访问多表:
SELECT a.title, b.address FROM books a, authors b WHERE b.author=a.author
请提供一个满足上述要求的解决方案,谢谢!
 
File->New->Others...->New->XML Data Binding
 
to LeeChange:
谢谢!不过能否解释一下,那是个啥东西呀?能实现啥功能啊?
 
呵呵,你自己试一下岂不是更爽.
 
是挺爽的,噼里啪啦就出来了,生成了一个新单元,声明了一堆接口,老多老多的方法。
可是咋用啊啊啊?
 
呵呵,如果你看了他生成的代码都不知道怎么用的话,在下也没办法了.
他的每个方法的名字都是可以望文生义的.
 
好象把一个XML文件绑定(或者说映射)成一个对象了。但是还是不能实现SQL操作啊。
 
说明一下:
  在发帖子之前我做过一个函数包,已经可以把xml文件映射成一个数据集了,并且也有
根据指定字段的取值来筛选记录的功能,只是不想自己写SQL的解析器,所以才到大富翁上
来请教的。
 
declare @idoc int
declare @doc varchar(1000)
set @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
<Order OrderID="10248" CustomerID="VINET" EmployeeID="5"
OrderDate="1996-07-04T00:00:00">
<OrderDetail ProductID="11" Quantity="12"/>
<OrderDetail ProductID="42" Quantity="10"/>
</Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
<Order OrderID="10283" CustomerID="LILAS" EmployeeID="3"
OrderDate="1996-08-16T00:00:00">
<OrderDetail ProductID="72" Quantity="3"/>
</Order>
</Customer>
</ROOT>'
--Create an internal representation of the XMLdo
cument.
exec sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT stmt using OPENXML rowset provider
SELECT *
FROM OPENXML (@idoc, '/ROOT/Customer/Order/OrderDetail',2)
WITH (OrderID int '../@OrderID',
CustomerID varchar(10) '../@CustomerID',
OrderDate datetime '../@OrderDate',
ProdID int '@ProductID',
Qty int '@Quantity')
结果如下:
OrderID CustomerID OrderDate ProdID Qty
------------------------------------------------------------------------
10248 VINET 1996-07-04 00:00:00.000 11 12
10248 VINET 1996-07-04 00:00:00.000 42 10
10283 LILAS 1996-08-16 00:00:00.000 72 3
C. 获得边缘表格式的结果
如果是SQL数据库,
可以将上边这些封装成一个函数或过程
 

to xzh2000:
老大啊,还没看清楚我的问题就粘了一段不知哪来的SQLServer代码啊?!!!
 
用TClientDataset可以像操作数据库一样操作xml文件,只要指定他的文件名就可以了
 
Tmybook=recode
title:string;
author:string;
price:float;
end;
Tmybooks=array of Tmybook;
//1.读XML到Tmybooks中.
//2.for i:=0 to Tmybooks.length-1do
mybook=Tmybooks;
if mybook.price?>0 then
...
 
to encamp:
CDS确实可以用First,Last,Prior,Next,Locate来操作数据集,但是我需要用SQL语句。
to li_cj
你的意思我明白,可是我需要动态解析SQL,不能把判断检索的过程写死。
请各位再费心!谢谢!
 
不错不错:)
 
来自:LeeChange, 时间:2003-5-20 9:36:00, ID:1876803
File->New->Others...->New->XML Data Binding
是delphi的new窗体?我的怎么没见着others?
 
直接用SQL来作不容易啊,有这样的数据集吗?
 
create procedure up_xml_test(@doc varchar(7999))
as
begin
declare @idoc int
exec sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT *
FROM OPENXML (@idoc, '/root/dataset/books',2)
with(title varchar(32) 'title',
author varchar(20) 'author',
price decimal(9,2) 'price')
exec sp_xml_removedocument @idoc
end

go
declare @doc varchar(7999)
select @doc=
'<root>
<dataset>
<books>
<title>Delphi</title>
<author>abc</author>
<price>38.00</price>
</books>
<books>
<title>MIDAS</title>
<author>def</author>
<price>26.00</price>
</books>
</dataset>
</root>'
exec up_xml_test @doc
go
试试这句话,可惜不能操作汉字。
 
to xzh2000:
1、我的程序不使用任何数据库,除了XML。
2、我的XML是活的,不是写死在存储过程里的字符串。
 
听说哈工大某教授搞了一个小型的XML数据库,
想来可以实现你的要求。
 
看来,要是只用Delphi,就只能自己写SQL的解析器(Parser)了。
 
后退
顶部