1

我正在使用 XML DOM 技术在 JavaScript 中构建下拉菜单。

创建<option>节点后,我会附加应该为该选项显示的文本。我面临的问题是,当文本包含字符实体引用(CER)时,例如&#8322;CER 的 & 字符被转义为&amp;,因此当菜单输出到时,选择菜单中显示的是 CER 而不是字符显示的页面。

我尝试了以下两种方法: optionNode.appendChild(xmlDoc.createTextNode(label)); 和

optionNode.textContent = label;

两者都给出相同的结果。在将 XML 文档输出为文本后,我可以通过对&amp;with进行全局替换来解决此问题:&

var xml = (new XMLSerializer()).serializeToString(xmlDoc);
return xml.replace(/&amp;/g, '&');

但我敢肯定,首先必须有一种方法可以避免逃跑。在那儿?

4

2 回答 2

0

我找到了解决方案。在创建包含 的节点之前label,我将所有字符实体引用转换label为 Unicode 字符。然后,当我将 xml 输出为字符串时,我将所有 Unicode 字符转换回字符实体引用。代码改编自我在 Stack Overflow 其他地方找到的代码。

function cerToUnicode(str) {
    "use strict";
    var entity_table = {
       '&quot;': String.fromCharCode(34), // Quotation mark. Not required
       '&amp;': String.fromCharCode(38), // Ampersand
               '&lt;': String.fromCharCode(60), // Less-than sign
       '&gt;': String.fromCharCode(62), // Greater-than sign
       '&nbsp;': String.fromCharCode(160), // Non-breaking space
       '&iexcl;': String.fromCharCode(161), // Inverted exclamation mark
       ... // other named CERs
   };
   str = str.replace(/&#(\d+);/g,
       function (matched, capture1) {
           return (capture1 == '38' ? '&amp;' : String.fromCharCode(capture1));
       });
   str = str.replace(/&[^;]*;/g,
       function (matched) {
           return entity_table[matched];
       });
   return str;
} // cerToUnicode()

function unicodeToCER(str) {
    return str.replace(/./gm, function(s) {
        var code = s.charCodeAt(0);
        return (code < 128 ? s : "&#" + code + ";");
    });
} // unicodeToCER()
于 2018-03-29T16:55:15.667 回答
0

你可以使用createCDATASection()而不是createTextNode()

var docu = new DOMParser().parseFromString('<xml></xml>',  "application/xml")
var cdata = docu.createCDATASection('Some <CDATA> data & then some');
docu.getElementsByTagName('xml')[0].appendChild(cdata);

alert(new XMLSerializer().serializeToString(docu));
// Displays: <xml><![CDATA[Some <CDATA> data & then some]]></xml>
于 2018-03-21T20:47:54.033 回答