Firefox与Chrome中XMLSerializer的细微差别?

时间:2013-01-09 23:46:34

标签: xml json google-chrome firefox xmlserializer

以下代码片段使用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,并能够保留键顺序。

1 个答案:

答案 0 :(得分:3)

Firefox序列化是正确的。当您使用createElement而不是createElementNS创建这些元素时,会将它们放在空命名空间中(您可以在创建元素后检查元素的namespaceURI进行检查)。但是,解析Chrome生成的序列化会将它们放在http://example.org/v1命名空间中。

是的,Firefox输出是有效的XML。是什么让你觉得它无效?

我提交了https://bugs.webkit.org/show_bug.cgi?id=106531