XMLSerializer 在 IE10/11 和旧版 Edge(≤18)中完全不存在,Edge 79(Chromium 内核)起才支持;现代浏览器行为基本一致但存在自闭合标签、属性顺序和命名空间前缀差异;IE 下可 fallback 使用 element.xml 属性(仅限 XML 文档创建的节点)。

XMLSerializer 在 IE 和旧版 Edge 中根本不存在
如果你在 IE10、IE11 或旧版 Edge(≤18)里调用 XMLSerializer,会直接抛出 ReferenceError: XMLSerializer is not defined。这不是兼容性问题,而是这些浏览器压根没实现这个接口——W3C 标准虽早有定义,但微软直到 Edge 79(Chromium 内核)才开始支持。
Chrome/Firefox/Safari 中的 XMLSerializer 行为基本一致,但注意序列化结果差异
现代浏览器都支持 XMLSerializer.serializeToString(),但对以下情况处理略有不同:
- 自闭合标签:
在 HTML 文档中被解析为还是,取决于原始文档类型(HTML vs XML)和节点创建方式 - 属性顺序:Firefox 通常按 DOM 属性添加顺序输出;Chrome 可能重排(如
class总在前),但不保证 - 命名空间前缀:若节点含
xmlns,Safari 有时省略显式声明,而 Firefox 保留
示例:对一个动态创建的 调用 serializeToString(),输出可能不含 xmlns(如果上下文已默认声明),也可能重复声明——这取决于序列化时的 ownerDocument 是否带命名空间信息。
替代方案:IE/Edge ≤18 下如何安全序列化 XML 节点
不能依赖 XMLSerializer 时,需手动构造字符串或降级使用 XMLHttpRequest + responseXML 回写。更实用的是封装一个轻量 fallback:
立即学习“前端免费学习笔记(深入)”;
function serializeNode(node) {
if (typeof XMLSerializer !== 'undefined') {
return new XMLSerializer().serializeToString(node);
}
// IE fallback:仅适用于简单 XML 节点(无命名空间、无 CDATA、无 ProcessingInstruction)
if (node.xml !== undefined) {
return node.xml; // IE 支持 element.xml 属性(仅限 XML 文档,非 HTML)
}
throw new Error('XML serialization not supported in this environment');
}
注意:element.xml 仅在 IE 的 document.implementation.createDocument() 创建的 XML 文档中有效;若节点来自 HTML 文档(document.createElement()),该属性为 undefined。
HTML5 文档类型不影响 XMLSerializer 的可用性,但影响输入节点合法性
声明本身不决定 XMLSerializer 是否存在,但它会影响你传入的节点是否能被正确解析为 XML 结构:
- 在 HTML 文档中用
document.createElement('my-tag')创建的节点,即使加了xmlns,serializeToString()也可能忽略命名空间 - 必须用
document.implementation.createDocument(null, 'root')创建 XML 文档,并在其内创建节点,才能确保命名空间、属性大小写等被忠实序列化 - Chrome 90+ 对 HTML 文档中的 SVG 元素序列化更严格,会自动补全
xmlns;而 Firefox 仍依赖显式设置
真正卡住人的不是“哪个 HTML5 版本”,而是你用什么方式创建节点、文档类型是否匹配、以及目标浏览器是否支持 XMLSerializer —— 这三者缺一不可。










