以下代碼片段使用createDocument和XMLSerializer API將Javascript對象轉換爲XML字符串。問題在於它在Chrome(23.0.1271.101)和Firefox(14.0.1)瀏覽器上生成不同的輸出。Firefox和Chrome中XMLSerializer的細微差別?
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>
它看起來像在XMLSerializer的Firefox和Chrome有細微的差別,但我需要驗證這一點。無論如何,Firefox輸出都是無效的XML。有人可以對此有所瞭解嗎?
是否有更好的方法來生成在瀏覽器的XML文檔?
如果在第一個地方,我不會做這個,我有辦法序列化JSON與保留鍵順序的能力。
沒有太多我們可以做控制的XMLSerializer的默認/假設和Firefox產生什麼不是無效的文檔,但命名空間處理的實施細則。您可以從'xmlDoc.createElement(「Name」);'到'xmlDoc.createElementNS(「http://example.org/v1」,「Name」); '這會幫助你解決問題 – Baski
正如其他人所說,嘗試改變'var標記= xmlDoc.createElement(標籤名);''來var標記= xmlDoc.createElementNS(' http://example.org/v1' , tagName);'在你想要的命名空間中擁有這些元素。 – JLRishe