【发布时间】:2015-01-11 21:36:01
【问题描述】:
我正在使用从Microsoft XML 类型库生成的MSXML2_TLB.pas 来调用一个非常简单的网络服务,所以我不需要完整的 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.。
为什么解析器没有从响应头中获取“字符集”值?有没有办法告诉 XMLHTTP 实例使用响应头中的字符集值?
更新:我不知道它是否重要,但响应也不是以 <?xml 开头的,即使它确实如此,我也无法请求/修改它,所以它会有一个encoding="iso-8859-1" 属性。
【问题讨论】:
-
你说响应也不以开头,那么这是否是有效的XML?或者你的意思是序言不包含编码?如果是后者,恐怕你运气不好,为了可靠处理,使用 UTF-8 或 UTF-16 以外的字符编码的 XML 文档必须在 XML 声明中包含编码声明。 (
Source) -
请将其发布为答案,以便我接受。
-
@StijnSanders,您可以使用
r.responseText(根据需要修改它以包含字符集声明)并将其加载到新的 XMLDOC 中,而不是直接使用responseXML对象。 -
stackoverflow.com/a/9959386/937125 可能会有所帮助。
-
@kobik:是的,这就是我用来让它工作的(现在)