政府の Web サイトから 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
(さらに重要なことに) 動作させるにはどうすればよいですか?ServerXMLHTTP60