在下面代码中调试,找出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>

解决方案 »

  1.   

    你要保存这个xml,直接RtnStream.savetofile就好了,干嘛又用XmlDoc loadformstream?
    直接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>
      

  2.   

      当然可以的,但是因为这个函数是频繁使用的,所以不保存为文件,
      而是根据流,生成xml对象,然后解析它,写入数据库。   那照你这么说loadformstream这个函数就不该存在了。
      

  3.   

    拍拍网的api接口,返回是字符串转码而来的byte流
      

  4.   

    俺没有装什么NativeXml,不过啥三方组件都会提供文档和示例的,你先看过文档了示例没找到答案再说了。
    或者直接跟进这个TNativeXml源码里看它的loadfromstream是怎么实现的,对于流注意它的seek
      

  5.   

    上面代码换成TXMLDocument就可以处理。
    我怀疑NativeXML读取流支持的不好。因为频繁使用读取xml数据,我担心TXMLDocument内存释放不好,
    才想改为NativeXML,
    结果NativeXML支持流处理,这么差。
      

  6.   

    试试用TNativeXML.LoadFromURL() 
    也是返回空的xml
      

  7.   

    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
      

  8.   

    你加一句
    RtnStream :=TMemoryStream.Create;
    IdHTTP1.get(url, RtnStream);
    RtnStream.seek(0,0); // 把流的针头重置到开始 
    XmlDoc.LoadFromStream(RtnStream);
    XmlDoc.SaveToFile('test.xml');
      

  9.   

    TNatieveXML,没有TXMLDocument稳定。
      

  10.   

    RtnStream.seek(0,0); // 把流的针头重置到开始 加了上面这句后,就可以从流里获得xml对象了。
    那说明XmlDocument,把流的指针头部移到了头部,
    而TNativeXML没有,加上这句。哎,第三方控件总是这样漏代码。
      

  11.   

    虽然没用过TNativeXML,但它的大名也是有所闻的,TNativeXML也是经历了多年多个版本升迁的老牌组件了,人家不可能没想到这个stream position问题,这肯定不是疏漏,人家之所以这么做肯定是有考虑的,或者人家文档里就有了说明,LZ这个缘由怪TNativeXML是不对滴。