я получаю некоторый 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-документ, когда:
Подробно:
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
) вести себя как задокументировано?