

新闻资讯
技术学院XMLSerializer 在 IE10/11 和旧版 Edge(≤18)中完全不存在,Edge 79(Chromium 内核)起才支持;现代浏览器行为基本一致但存在自闭合标签、属性顺序和命名空间前缀差异;IE 下可 fallback 使用 element.xml 属性(仅限 XML 文档创建的节点)。
如
果你在 IE10、IE11 或旧版 Edge(≤18)里调用 XMLSerializer,会直接抛出 ReferenceError: XMLSerializer is not defined。这不是兼容性问题,而是这些浏览器压根没实现这个接口——W3C 标准虽早有定义,但微软直到 Edge 79(Chromium 内核)才开始支持。
现代浏览器都支持 XMLSerializer.serializeToString(),但对以下情况处理略有不同:
在 HTML 文档中被解析为 还是 ,取决于原始文档类型(HTML vs XML)和节点创建方式class 总在前),但不保证xmlns,Safari 有时省略显式声明,而 Firefox 保留示例:对一个动态创建的 调用 serializeToString(),输出可能不含 xmlns(如果上下文已默认声明),也可能重复声明——这取决于序列化时的 ownerDocument 是否带命名空间信息。
不能依赖 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。
声明本身不决定 XMLSerializer 是否存在,但它会影响你传入的节点是否能被正确解析为 XML 结构:
document.createElement('my-tag') 创建的节点,即使加了 xmlns,serializeToString() 也可能忽略命名空间document.implementation.createDocument(null, 'root') 创建 XML 文档,并在其内创建节点,才能确保命名空间、属性大小写等被忠实序列化xmlns;而 Firefox 仍依赖显式设置真正卡住人的不是“哪个 HTML5 版本”,而是你用什么方式创建节点、文档类型是否匹配、以及目标浏览器是否支持 XMLSerializer —— 这三者缺一不可。