在下面代码中调试,找出NativeXml.loadFromSteam返回为空的原因?
在浏览器中的地址栏里输入Url(代码里有),是有xml返回的,所以排除了流为空的情况。
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdHTTP;
////根据URl,发送Http get请求,得到NativeXml的对象用函数(访问拍拍店铺的订单xml)
procedure TForm1.Button1Click(Sender: TObject);
var IdHTTP1 :TIdHTTP; RtnStream :TMemoryStream; url :string; XmlDoc :TNativeXml;
begin
url :='http://api.paipai.com/deal/sellerSearchDealList.xhtml?accessToken=fc3b8228216463071bc3099c5883f3e4&appOAuthID'
+'=700134922&charset=utf-8&dealState=DS_WAIT_SELLER_DELIVERY&format=xml&pageIndex=1&pageSize=10&randomValue=11229'
+'&sellerUin=25594165&timeStamp=1374226526&uin=25594165&sign=%2FQttjMDhCFaufpB03uAUAcPLR%2F4%3D'; XmlDoc :=TNativeXml.Create(self);
IdHTTP1 :=Tidhttp.Create(nil); try
with IdHTTP1 do begin
Request.Accept :='text/html, */*';
Request.ContentLength :=0;
Request.ContentRangeEnd :=0;
Request.ContentRangeStart :=0;
Request.UserAgent :='Mozilla/3.0 (compatible; Indy Library)';
end; try
RtnStream :=TMemoryStream.Create;
IdHTTP1.get(url, RtnStream); XmlDoc.LoadFromStream(RtnStream);
XmlDoc.SaveToFile('test.xml'); //输出文件为空,而浏览器地址中输入url,有返回 except
on E: Exception do begin
end;
end;
finally
idhttp1.Free; RtnStream.free;
end;
end;在浏览器中的地址栏里输入Url,是有xml返回的
<?xml version="1.0" encoding="utf-8" ?>
- <sellerSearchDealList>
<errorCode>0</errorCode>
<errorMessage />
<pageIndex>1</pageIndex>
<pageTotal>0</pageTotal>
<countTotal>0</countTotal>
<dealList />
</sellerSearchDealList>
在浏览器中的地址栏里输入Url(代码里有),是有xml返回的,所以排除了流为空的情况。
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdHTTP;
////根据URl,发送Http get请求,得到NativeXml的对象用函数(访问拍拍店铺的订单xml)
procedure TForm1.Button1Click(Sender: TObject);
var IdHTTP1 :TIdHTTP; RtnStream :TMemoryStream; url :string; XmlDoc :TNativeXml;
begin
url :='http://api.paipai.com/deal/sellerSearchDealList.xhtml?accessToken=fc3b8228216463071bc3099c5883f3e4&appOAuthID'
+'=700134922&charset=utf-8&dealState=DS_WAIT_SELLER_DELIVERY&format=xml&pageIndex=1&pageSize=10&randomValue=11229'
+'&sellerUin=25594165&timeStamp=1374226526&uin=25594165&sign=%2FQttjMDhCFaufpB03uAUAcPLR%2F4%3D'; XmlDoc :=TNativeXml.Create(self);
IdHTTP1 :=Tidhttp.Create(nil); try
with IdHTTP1 do begin
Request.Accept :='text/html, */*';
Request.ContentLength :=0;
Request.ContentRangeEnd :=0;
Request.ContentRangeStart :=0;
Request.UserAgent :='Mozilla/3.0 (compatible; Indy Library)';
end; try
RtnStream :=TMemoryStream.Create;
IdHTTP1.get(url, RtnStream); XmlDoc.LoadFromStream(RtnStream);
XmlDoc.SaveToFile('test.xml'); //输出文件为空,而浏览器地址中输入url,有返回 except
on E: Exception do begin
end;
end;
finally
idhttp1.Free; RtnStream.free;
end;
end;在浏览器中的地址栏里输入Url,是有xml返回的
<?xml version="1.0" encoding="utf-8" ?>
- <sellerSearchDealList>
<errorCode>0</errorCode>
<errorMessage />
<pageIndex>1</pageIndex>
<pageTotal>0</pageTotal>
<countTotal>0</countTotal>
<dealList />
</sellerSearchDealList>
直接rtnstream.savefofile可以得到
<?xml version="1.0" encoding="utf-8"?>
<sellerSearchDealList>
<errorCode>0</errorCode>
<errorMessage></errorMessage>
<pageIndex>1</pageIndex>
<pageTotal>0</pageTotal>
<countTotal>0</countTotal>
<dealList>
</dealList>
</sellerSearchDealList>
而是根据流,生成xml对象,然后解析它,写入数据库。 那照你这么说loadformstream这个函数就不该存在了。
或者直接跟进这个TNativeXml源码里看它的loadfromstream是怎么实现的,对于流注意它的seek
我怀疑NativeXML读取流支持的不好。因为频繁使用读取xml数据,我担心TXMLDocument内存释放不好,
才想改为NativeXML,
结果NativeXML支持流处理,这么差。
也是返回空的xml
http://api.paipai.com/deal/sellerSearchDealList.xhtml?accessToken=fc3b8228216463071bc3099c5883f3e4&appOAuthID=700134922&charset=utf-8&dealState=DS_WAIT_SELLER_DELIVERY&format=xml&pageIndex=1&pageSize=10&randomValue=11229&sellerUin=25594165&timeStamp=1374226526&uin=25594165&sign=%2FQttjMDhCFaufpB03uAUAcPLR%2F4%3D
RtnStream :=TMemoryStream.Create;
IdHTTP1.get(url, RtnStream);
RtnStream.seek(0,0); // 把流的针头重置到开始
XmlDoc.LoadFromStream(RtnStream);
XmlDoc.SaveToFile('test.xml');
那说明XmlDocument,把流的指针头部移到了头部,
而TNativeXML没有,加上这句。哎,第三方控件总是这样漏代码。