跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

XML HTTP Request对象详解 Ajax如何请求XML数据

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
仍不可替代: 基于jQuery的AJAX和JSON的实例 中文WORD版 本文档主要讲述的是基于jQuery的AJAX和JSON的实例;过jQuery内置的AJAX功能,直接访问后台获得JSON格式的数据,然后通过jQuer把数据绑定到事先设计好的html模板上,直接在页面上显示。有需要的朋友可以下载看看 下载 需要监听上传进度(
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
,浏览器就已经在后台完成了解析树构建。这点很容易被忽略。

相关文章