websocket 不能直接发送 xmldocument,需用 xmlserializer 序列化为字符串或 textencoder 编码为 arraybuffer;服务端须按 utf-8 解析,中文乱码多因编码不一致;大 xml 宜用 arraybuffer 优化内存;元信息需自行封装,不可依赖 xml 声明或 content-type。

WebSocket 不能直接发送 XMLDocument 对象,必须先序列化为字符串或二进制;服务端收到后也需按相同编码解析,否则中文会变乱码。
为什么 ws.send(xmlDoc) 会发成 [object XMLDocument]
浏览器的 WebSocket.send() 方法只接受 String、ArrayBuffer、Blob 或 TypedArray,不识别 DOM 接口对象。直接传 XMLDocument 会触发 toString(),结果就是那个毫无意义的字符串。
- 正确做法是用
XMLSerializer转成字符串:new XMLSerializer().serializeToString(xmlDoc) - 如果 XML 含有
<?xml version="1.0" encoding="GBK"?>声明,仅影响客户端解析逻辑,不影响传输——WebSocket 本身无编码字段,全程靠 UTF-8 字节流承载 - 服务端若用 Node.js 的
ws库接收,message事件的e.data默认是Buffer(非字符串),需显式.toString('utf8'),否则直接JSON.parse或DOMParser会失败
DOMParser 解析 WebSocket 收到的 XML 字符串要注意什么
前端用 DOMParser 处理 onmessage 回来的 XML 字符串时,常见错误是忽略命名空间或未捕获解析异常。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 确保传入的是纯字符串,不是
ArrayBuffer:若后端发的是二进制,前端要设ws.binaryType = 'arraybuffer',再用TextDecoder转回字符串 -
DOMParser默认不支持外部 DTD,含DOCTYPE的 XML 可能报错;可加选项{fatal: false}(部分浏览器支持)或预处理移除 - 中文解析失败?检查服务端是否用了非 UTF-8 编码发送,或前端没指定解析编码:
parser.parseFromString(xmlStr, 'application/xml')中 MIME 类型只是提示,不强制编码
大 XML(>500KB)用 TextEncoder + ArrayBuffer 更省内存
对较大 XML 文档,先拼成字符串再 send() 会产生两份内存拷贝(字符串 + 内部 UTF-8 编码缓冲区);用 TextEncoder 直接生成 Uint8Array 可避免。
- 序列化后立即编码:
const bytes = new TextEncoder().encode(xmlStr),然后ws.send(bytes.buffer) - 服务端接收时需以相同字节流处理,Node.js 中
ws库的message事件若收到 binary,e.data是Buffer,可直接buffer.toString('utf8') - 注意:
TextEncoder固定用 UTF-8,不认 XML 声明里的encoding属性;若原始 XML 是 GBK,必须先转码再 encode,否则乱码
WebSocket 里没有 Content-Type,XML 校验得自己加
HTTP 上传 XML 时靠 Content-Type: application/xml 告诉服务端格式,还能附带 Content-MD5;WebSocket 没有这些头部字段,所有元信息都得塞进 payload 里。
- 建议在 XML 外包一层 JSON 封装:
{type: 'xml', content: '...', checksum: '...'},再ws.send(JSON.stringify(...)) - 或用 WebSocket 子协议协商,如连接时传
protocols: ['xml-v1', 'with-md5'],服务端据此启用对应校验逻辑 - 别依赖
<?xml ?>声明做编码判断——它只是 XML 解析器的提示,传输层完全无视
真正容易被忽略的是:WebSocket 连接建立后,binaryType 默认是 'blob',但多数 XML 场景应设为 'arraybuffer',否则 e.data 是 Blob,读取前还得调 blob.arrayBuffer(),多一次异步开销。










