IXMLHttpRequest.responseXml пуст, без ошибок синтаксического анализа, когда responseText содержит действительный Xml

я получаю некоторый XML с правительственного веб-сайта :

http://www.bankofcanada.ca/stats/assets/rates_rss/noon/en_all.xml

я использую следующий довольно простой код:

var
   szUrl: string;
   http: IXMLHTTPRequest;
begin
   szUrl := 'http://www.bankofcanada.ca/stats/assets/rates_rss/noon/en_all.xml';

   http := CoXMLHTTP60.Create;
   http.open('GET', szUrl, False, '', '');
   http.send(EmptyParam);

   Assert(http.Status = 200);

   Memo1.Lines.Add('HTTP/1.1 '+IntToStr(http.status)+' '+http.statusText);
   Memo1.Lines.Add(http.getAllResponseHeaders);
   Memo1.Lines.Add(http.responseText);

я не буду показывать все тело это возвращает, но он возвращает действительный xml в responseText:

HTTP/1.1 200 OK
Cache-Control: max-age=5
Connection: keep-alive
Connection: Transfer-Encoding
Date: Fri, 30 Mar 2012 14:50:50 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Expires: Fri, 30 Mar 2012 14:50:55 GMT
Server: Apache/2.2.16 (Unix) PHP/5.3.3 mod_ssl/2.2.16 OpenSSL/1.0.0d mod_perl/2.0.4 Perl/v5.12.0
X-Powered-By: PHP/5.3.3




    
        Bank of Canada: Noon Foreign Exchange Rates
        http://www.bankofcanada.ca/rates/exchange/noon-rates-5-day/

Хорошо, хорошо, там есть действительный xml. я знаю, что это действительно так, потому что... просто посмотрите на это. Но я также знаю, что он действителен, разбирая его:

var
   ...
   szXml: WideString;
   doc: DOMDocument60;
begin
   ...
   szXml := http.responseText;

   doc.loadXML(szXml);
   Assert(doc.parseError.errorCode = 0);

   Memo1.Lines.Add('============parsed xml');
   Memo1.Lines.Add(doc.xml);

ОригинальныйIXmlHttpRequestсодержит свойствоresponseXml . Из MSDN:

Представляет проанализированное тело объекта ответа.

Если тело объекта ответа не является допустимым XML, это свойство возвращает DOMDocument, который был проанализирован, чтобы вы могли получить доступ к ошибке. Это свойство не возвращает IXMLDOMParseError само по себе, но доступно из DOMDocument.

В моем случае свойство responseXml существует, как и должно быть:

Assert(http.responseXml <> nil);

И нет ошибки синтаксического анализа responseText:

doc := http.responseXml as DOMDocument60;
Assert(doc.parseError.errorCode = 0);

, как должно быть, поскольку xml действителен.

За исключением того, что когда я смотрю на http.объект документа responseXml, он пустой:

   Memo1.Lines.Add('============responseXml');
   Memo1.Lines.Add(doc.xml);

IXMLHttpRequest (и IXMLServerHttpRequest) возвращает пустой XML-документ, когда:

  • есть xml
  • xml действителен
  • нет ошибки синтаксического анализа

Подробно:

uses
    msxml2_tlb;

procedure TForm1.Button1Click(Sender: TObject);
var
    szUrl: string;
    http: IXMLHTTPRequest;
    doc: DOMDocument60;
begin
    szUrl := 'http://www.bankofcanada.ca/stats/assets/rates_rss/noon/en_all.xml';

    http := CoXMLHTTP60.Create; //or CoServerXmlHttpRequest.Create
    http.open('GET', szUrl, False, '', '');
    http.send(EmptyParam);

    Assert(http.Status = 200);

    doc := http.responseXml as DOMDocument60;
    Assert(doc.parseError.errorCode = 0);

    ShowMessage('"'+doc.xml+'"');
end;

Как заставитьXmlHttpRequest(и, что более важно,ServerXMLHTTP60) вести себя как задокументировано?

7
задан Ian Boyd 31 March 2012 в 15:14
поделиться