我正在使用MSXML2_TLB.pas
类型库生成的Microsoft XML
来调用一个非常简单的Web服务,所以我不需要完整的XML包装,只需执行此操作:
var
r:XMLHTTP;
begin
r:=CoXMLHTTP.Create;
r.open('POST',WebServiceURL,false,'','');
r.setRequestHeader('Content-Type','application/xml');
r.send('<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" '+
'xmlns:ns="http://somebigcorporation.com/api/ws1/">'+
'<soapenv:Body>'+
//snip: irrelevant to the question
'</soapenv:Body></soapenv:Envelope>');
if r.status<>200 then raise Exception.Create(r.statusText);
Result:=(r.responseXML as DOMDocument).documentElement.firstChild.firstChild.selectSingleNode('importantData');
end;
网络服务很好地响应状态200和Content-Type: text/xml; charset=iso-8859-1
。
在某些情况下,documentElement
为nil(以上代码会引发访问冲突)。显然responseXML
存在,但仅提供parseError
对象(在the docs中表示如此),parseError.reason
在这些情况下为An invalid character was found in text content.
。
为什么解析器没有从响应头中获取'charset'值?有没有办法告诉XMLHTTP实例使用响应头中的charset值?
更新:我不知道它是否重要,但响应也不是以<?xml
开头,即使它确实如此,我也无法请求/修改它它将具有encoding="iso-8859-1"
属性。
答案 0 :(得分:0)
我认为您需要在请求中设置字符集,以便结果正确。
r.setRequestHeader('Content-Type', 'application/xml; charset=ISO-8859-1');