1

次のコードスニペットは、createDocumentおよびXMLSerializerAPIを使用して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にシリアル化する方法があれば、これは実行しません。

4

1 に答える 1

3

Firefoxのシリアル化は正しいです。createElementではなく、を使用してこれらの要素を作成すると、createElementNSそれらはnull名前空間に配置されます(作成後に要素のを調べることで確認namespaceURIできます)。ただし、Chromeが生成するシリアル化を解析すると、それらはhttp://example.org/v1名前空間に配置されます。

はい、Firefoxの出力は有効なXMLです。なぜそれが無効だと思ったのですか?

https://bugs.webkit.org/show_bug.cgi?id=106531を提出しました

于 2013-01-10T07:08:38.473 に答える