我有以下最小的 JavaScript 片段:
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/1999/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
当我在大多数浏览器中执行代码时(只需将其粘贴到浏览器的 JavaScript 控制台中),解析后序列化的 XML 与原始 XML 相同。例如在 Chrome 8 上,我得到:
<El xmlns:a="http://www.w3.org/1999/xlink" a:title="T" a:href="H"/>
然而,在 Chrome 22 上,相同的代码片段将 XML 更改为:
<El xmlns:a="http://www.w3.org/1999/xlink" xlink:title="T" xlink:href="H"/>
请注意,xlink
title 和 href 属性使用的命名空间前缀未在任何地方定义,因此 XML 现在无效。正如您可能想象的那样,这会给随后尝试使用 XML 的代码带来各种问题。
这是 XMLSerializer 中的一个错误,还是我错过了一些关于如何序列化 DOM 的复杂性?
还有没有人找到我可以在代码中输入的解决方法,而不是让 XML 匹配xlink
作为 XLink 命名空间前缀的明显偏好?
更新
我做了一些额外的测试,问题似乎是由于 XMLSerializer 识别 XLink 命名空间并坚持为其输出xlink
前缀,而没有正确注册该前缀。
所以这个片段工作正常:
var xml = '<El a:title="T" a:href="H" xmlns:a="any-other-namespace-uri" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
所以在这里我将命名空间 URL 更改为不太知名的东西,输出现在有效:
<El xmlns:a="any-other-namespace-uri" a:title="T" a:href="H"/>
以下片段也可以正常工作:
var xml = '<El a:title="T" a:href="H" xmlns:a="http://www.w3.org/2000/xlink" />';
var dom = new DOMParser().parseFromString(xml, 'text/xml');
xml = new XMLSerializer().serializeToString(dom);
所以在这种情况下,我们使用 XLink 命名空间的“预期”前缀,然后它会毫无问题地序列化:
<El xmlns:a="http://www.w3.org/2000/xlink" a:title="T" a:href="H"/>