xmlhttprequest get 请求未获数据,需设 responsetype='document'并确保跨域许可、mime类型正确;responsexml为null常见于状态码非200、content-type不符或xml语法错误;大xml应避免全量解析,改用xpath或sax流式处理。

XMLHttpRequest 发送 GET 请求时没拿到数据?先检查 responseType
默认情况下,XMLHttpRequest 的 responseType 是空字符串,此时 response 是字符串,哪怕你请求的是 XML 文件。浏览器不会自动解析成 XMLDocument,得手动设。
- 要让
response直接是可遍历的 XML 文档对象,必须显式设置xmlhttp.responseType = 'document' - 如果设成
'text'或留空,response就是原始字符串,得用(new DOMParser()).parseFromString(..., 'text/xml')手动解析——但这时容易因编码或格式错误返回null - 注意:设为
'document'后,跨域请求会失败(除非服务端明确允许Access-Control-Allow-Headers: Content-Type且响应 MIME 类型确实是application/xml或text/xml)
用 XMLHttpRequest 解析 XML 响应体时遇到 parseError?看状态码和 MIME 类型
常见现象是 xmlhttp.responseXML 为 null,控制台也没报错,但 xmlhttp.parseError(IE/旧 Edge)或 xmlhttp.status 异常暴露了问题。
-
xmlhttp.status不是200(比如0表示跨域被拦,404表示路径错)——此时responseXML必为null - 服务端返回的 HTTP
Content-Type不是text/xml、application/xml或application/xhtml+xml,现代浏览器会拒绝自动解析,responseXML直接为null - XML 内容本身有语法错误(如未闭合标签、非法字符),
responseXML也会是null;可用console.log(xmlhttp.responseText)看原始内容再校验
为什么不用 fetch 而坚持用 XMLHttpRequest?兼容性和流式处理是关键
不是为了怀旧,而是有些场景 XMLHttpRequest 仍不可替代:
- 需要监听上传进度(
upload.onprogress)或下载进度(onprogress),fetch没有原生支持,得靠ReadableStream+tee()自己拆流,复杂度高 - 老系统要求 IE11 支持,
fetch在 IE 全系缺席,而XMLHttpRequest从 IE5 就存在 - 需要中途中断请求(
xmlhttp.abort()),fetch得配合AbortController,但部分老安卓 WebView 对其支持不稳
XML 数据量大时卡顿?别直接操作 responseXML,改用流式 XPath 或事件解析
把整个 XML 加载进内存再用 getElementsByTagName 或 querySelector 查找,在几百 KB 以上就明显变慢,尤其在低端 Android 设备上。
- 避免写
xmlhttp.responseXML.querySelectorAll('item')这类全量遍历,改用DOMParser配合document.evaluate(XPath)做懒查 - 超大 XML(MB 级)建议服务端改用 JSON 流式接口;若必须 XML,前端可用
sax类库(如saxes)做事件驱动解析,不加载全文 - 注意:
responseType = 'document'会触发浏览器完整 DOM 构建,比'text'多出数倍内存占用和解析时间
XML 的“解析即加载”特性决定了它没法像 JSON 那样按需提取字段——只要用了 responseXML,浏览器就已经在后台完成了解析树构建。这点很容易被忽略。










