【发布时间】:2013-01-09 23:46:33
【问题描述】:
以下 sn-p 代码使用 createDocument 和 XMLSerializer API 将 Javascript 对象转换为 XML 字符串。问题是它在 Chrome (23.0.1271.101) 和 Firefox (14.0.1) 浏览器上生成不同的输出。
var item = { _dto: {...} }; // the 'model' object
var xmlDto = $('<Column />'); // this is eventually serialized and sent to the server
var optionalTags = ['Abstract', 'Note', 'Size', 'Digits', 'Nullable', 'AutoUpdate', 'DataType'];
// convert badgerfish JSON back to XML.
// use XML because it is not possible serialize JSON and preserve key order.
var xmlDoc = document.implementation.createDocument("http://example.org/v1", "Column", null);
var root = xmlDoc.childNodes[0];
var nameTag = xmlDoc.createElement("Name");
nameTag.setAttribute('uuid', item._dto['Name']['@uuid']);
nameTag.textContent=item._dto['Name']['$'];
root.appendChild(nameTag);
optionalTags.map(function (tagName) {
var tag = xmlDoc.createElement(tagName);
tag.textContent=item._dto[tagName];
if (item._dto.hasOwnProperty(tagName)) {
tag.textContent=item._dto[tagName];
root.appendChild(tag);
}
});
var xmlStr = new XMLSerializer().serializeToString(xmlDoc);
xmlStr = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'+xmlStr;
在 Chrome 上,会生成以下所需/预期的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Column xmlns="http://example.org/v1">
<Name uuid="001b5cbe-bab7-4880-90b6-9e8f47f6e4af">FAILED_ID</Name>
<Size>38</Size>
<Digits>0</Digits>
<Nullable>true</Nullable>
<AutoUpdate>false</AutoUpdate>
<DataType>NUMERIC</DataType>
</Column>
但在 Firefox 中,生成的输出在每个标签中插入了 xmlns 属性,其值为空:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Column xmlns="http://example.org/v1">
<Name xmlns="" uuid="001b5cbe-bab7-4880-90b6-9e8f47f6e4af">FAILED_ID</Name>
<Size xmlns="">38</Size>
<Digits xmlns="">0</Digits>
<Nullable xmlns="">true</Nullable>
<AutoUpdate xmlns="">false</AutoUpdate>
<DataType xmlns="">NUMERIC</DataType>
</Column>
看起来 Firefox 和 Chrome 中的 XMLSerializer 有细微的差异,但我需要验证这一点。在任何情况下,Firefox 输出都是无效的 XML。有人可以解释一下吗?
有没有更好的方法在浏览器中生成 XML 文档?
如果一开始我有办法序列化为 JSON 并能够保留键顺序,我就不会这样做。
【问题讨论】:
-
我们无法控制 XMLSerializer 的默认/假设,firefox 生成的不是无效文档,而是命名空间处理的实现细节。您可以从 'xmlDoc.createElement("Name");' 切换到 'xmlDoc.createElementNS("example.org/v1","Name"); ' 这应该可以帮助您解决问题
-
正如其他人所说,尝试将
var tag = xmlDoc.createElement(tagName);更改为var tag = xmlDoc.createElementNS('http://example.org/v1', tagName);以在所需的命名空间中包含元素。
标签: xml json google-chrome firefox xmlserializer