я получаю 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
<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:cb="http://www.cbwiki.net/wiki/index.php/Specification_1.1"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3c.org/1999/02/22-rdf-syntax-ns#rdf.xsd">
<channel rdf:about="http://www.bankofcanada.ca/stats/assets/rates_rss/noon/en_ALL.xml">
<title xml:lang="en">Bank of Canada: Noon Foreign Exchange Rates</title>
<link>http://www.bankofcanada.ca/rates/exchange/noon-rates-5-day/</link>
Хорошо, хорошо, там есть действительный 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
< /a> (и, что более важно, ServerXMLHTTP60
) вести себя как задокументировано?
http.responseText
. - person Warren P   schedule 30.03.2012document
(а неresponseText
) - person Ian Boyd   schedule 30.03.2012