2013-01-24 142 views
2

當序列化特殊字符(如TAB,換行符和回車)作爲屬性值時,我遇到了問題。屬性中的XML XMLSerializer特殊字符

根據這http://www.w3.org/TR/1999/WD-xml-c14n-19991109.html#charescaping,這些應分別編碼爲&\#x9;,&\#xA;&\#xD;。但撥打鉻:

var root = new DOMParser().parseFromString('<root></root>', 'text/xml').documentElement; 
root.setAttribute('a', 'first\nsecond'); 
var serialized = new XMLSerializer().serializeToString(root); 

給出一個字符串< root a="first\nsecond"/>與換行不轉義。

當加載一遍:

var loaded = new DOMParser().parseFromString(serialized, 'text/xml').documentElement; 
loaded.getAttribute('a'); 

返回「第一第二」換行丟失只是一個空間。有沒有人遇到過這個問題?任何幫助,將不勝感激。

感謝,

回答

0

我就遇到了這個問題,並通過在XML樹寫一個函數removeInvalidCharacters(的xmlNode),去除無效字符(從nodeValues)解決了這個問題。您可以在序列化之前使用它,以確保您不會收到無效字符。

You can find removeInvalidCharacters() in my stackoverflow question on the same topic

您可以使用removeInvalidCharacters()這樣的:

var stringWithSTX = "Bad" + String.fromCharCode(2) + "News"; 
var xmlNode = $("<myelem/>").attr("badattr", stringWithSTX); 

var serializer = new XMLSerializer(); 
var invalidXML = serializer.serializeToString(xmlNode); 

// Now cleanse it: 
removeInvalidCharacters(xmlNode); 
var validXML = serializer.serializeToString(xmlNode); 

我也對鉻提交問題報告,但值得注意的是,IE9有自己的缺陷在這個部門,所以修復W/O解決方案可能需要很長時間。

+0

Hey Seth, 感謝您的回答。 看着你的解決方案,它刪除了字符。我其實需要他們。我使用了不同的方法,觀察字符不會被轉義,但保持不變: 'var serializer = new XMLSerializer(); var invalidXML = serializer.serializeToString(xmlNode); var xml = escapeXMLCharacters(invalidXML); ' 幸運的是,我最終不需要反序列化。該解決方案也適用於IE9/8。請記住,這是逃生只有換行,換行符和選項卡,我不需要更多... – Viktor

+0

是!如果這就是你所需要的,那麼這是一個很好的方法。 IE9/8的問題在於它以編程方式賦予所有超出範圍的字符。不幸的是,0x2和其他擴展字符無效,即使以實體形式,即無效。因此,如果您需要能夠存儲交給您的任何字符串而不產生損壞的XML文件(我的目標),則必須在IE9/8授權之前轉義。 – Seth