Delphi MSXML:XMLHTTP不';不支持来自标题的字符集

Delphi MSXML:XMLHTTP不';不支持来自标题的字符集,delphi,msxml,Delphi,Msxml,我正在使用从Microsoft XML类型库生成的MSXML2_TLB.pas调用一个非常简单的web服务,因此我不需要完整的XML包装,只需执行以下操作: var r:XMLHTTP; begin r:=CoXMLHTTP.Create; r.open('POST',WebServiceURL,false,'',''); r.setRequestHeader('Content-Type','application/xml'); r.send('<soapenv:Env

我正在使用从
Microsoft XML
类型库生成的
MSXML2_TLB.pas
调用一个非常简单的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;
var
r:XMLHTTP;
开始
r:=CoXMLHTTP.Create;
r、 打开('POST',WebServiceURL,false,','');
r、 setRequestHeader('Content-Type','application/xml');
r、 发送(“”)+
''+
//剪:与问题无关
'');
如果为r.status200,则引发异常。创建(r.statusText);
结果:=(r.responseXML作为DOMDocument.documentElement.firstChild.firstChild.selectSingleNode('importantData');
结束;
Web服务响应良好,状态为200,内容类型为text/xml;字符集=iso-8859-1

在某些情况下,
documentElement
为nil(并且上面的代码引发访问冲突)。显然,
responseXML
存在,但只提供了一个
parseError
对象(它在中这样说)和
parseError。在这些情况下,原因是
在文本内容中发现了无效字符。

为什么解析器不从响应头中获取“charset”值?有没有办法告诉XMLHTTP实例使用响应头中的字符集值


更新:我不知道这是否重要,但是响应也不是以
开头的。我认为您需要在请求中设置字符集,以便结果正确

r.setRequestHeader('Content-Type', 'application/xml; charset=ISO-8859-1');

结果是正确的。请求也得到了正确处理,我将请求主体编码留给XMLHTTP对象。我怀疑设置请求内容类型会影响响应内容类型。问题在于XMLHTTP显然误解了响应的编码。@StijnSanders,这不是问题的核心,但在任何情况下,您都应该指定请求
内容类型
。web服务可能期望(并处理)这一点。例如,如果您指定了一个内容类型为UTF8的请求,您可能会惊讶地发现服务器响应也是UTF8。例如,ASMX.net web服务就是这样。您说响应也不是以Post作为答案开始的,所以我可以接受它。@StijnSanders,您可以使用
r.responseText
(根据您希望包含字符集声明的情况进行修改)并将其加载到新的XMLDOC中,而不是直接使用
responseXML
对象。也许会有帮助。@kobik:是的,这就是我用来让它工作的方法(现在)