【问题标题】:javascript XMLSerializer special characters in attributejavascript XMLSerializer 属性中的特殊字符
【发布时间】:2013-01-08 09:06:00
【问题描述】:

在将 TAB、换行和回车等特殊字符序列化为属性值时遇到了问题。

根据这个http://www.w3.org/TR/1999/WD-xml-c14n-19991109.html#charescaping,这些应该分别编码为&\#x9;&\#xA;&\#xD;。但是在 chrome 中调用:

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

给出一个字符串&lt; root a="first\nsecond"/&gt;,换行符没有转义。

再次加载时:

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

返回“第一秒”并且换行符丢失为一个空格。有没有人遇到过这个问题?任何帮助将不胜感激。

谢谢,

维克托

【问题讨论】:

    标签: javascript xml xml-parsing xml-serialization escaping


    【解决方案1】:

    我遇到了这个问题,并通过编写一个函数 removeInvalidCharacters(xmlNode) 解决了这个问题,该函数删除了 XML 树中的无效字符(从 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);
    

    我还提交了一份针对 chrome 的问题报告,但值得注意的是 IE9 在这个部门有自己的错误,因此没有解决方法的修复可能需要很长时间。

    【讨论】:

    • 嘿赛斯,谢谢你的回答。查看您的解决方案,它会删除字符。我真的需要它们。我使用不同的方法观察字符没有转义,但保持不变:var serializer = new XMLSerializer(); var invalidXML = serializer.serializeToString(xmlNode); var xml = escapeXMLCharacters(invalidXML ); 幸运的是,我最终不需要反序列化。此解决方案也适用于 IE9/8。但请记住,这只是转义换行符、换行符和制表符,我不需要更多...
    • 是的!如果这就是您所需要的,那么这是一个很好的方法。 IE9/8 的问题在于它以编程方式对所有超出范围的字符进行实体化。不幸的是,0x2 和其他扩展字符无效,即使是实体形式,即 无效。因此,如果您需要能够存储交给您的任何字符串而不产生损坏的 XML 文件(我的目标),您必须在 IE9/8 实体化之前转义。
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多