2013-01-24 99 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