将特殊的 HTML 字符插入 XML

Posted

技术标签:

【中文标题】将特殊的 HTML 字符插入 XML【英文标题】:Inserting special HTML characters into XML 【发布时间】:2020-02-04 14:24:57 【问题描述】:

我在 javascript 中用这个表达式生成一个 XML 字符串:

var xml = '<xml xmlns="http://www.w3.org/1999/xhtml">' + dom.outerHTML + '</xml>'

dom 是文档树中的某个节点。)

后来我读了一遍:

... = (new DOMParser).parseFromString(xml, "text/xml");

通常它可以正常工作,但当dom 中的一个字段包含不间断空格字符时会失败,该字符是使用 Alt+0160 手动键入的。 在dom.outerHTML 中,它显示为&amp;amp;nbsp;,但parseFromString 函数返回:

<xml xmlns="http://www.w3.org/1999/xhtml">
    <parsererror style="display: block; white-space: pre; border: 2px solid #c77; padding: 0 1em 0 1em; margin: 1em; background-color: #fdd; color: black">
        <h3>This page contains the following errors:</h3>
        <div style="font-family:monospace;font-size:12px">error on line 1 at column 139: Entity 'nbsp' not defined↵</div>
        <h3>Below is a rendering of the page up to the first error.</h3>
    </parsererror>
    ...
</xml>

(其实是函数结果,不是异常!很奇怪的解决方法(:.)

我也试过&amp;amp;nbsp;,没有&lt;parsererror&gt;标签就成功了,但被读回为"&amp;nbsp;"字符串,而不是UNICODE 160代码点。

可能其他 HTML 规范字符也会受到影响。

我应该在哪里以及如何转义/替换特殊的 HTML 字符以恢复与原来完全相同的dom

提前致谢。

【问题讨论】:

您应该使用&lt;![CDATA[]]&gt; 来执行字符数据。 ***.com/questions/2784183/what-does-cdata-in-xml-mean 你不能改用XMLSerializer吗? 【参考方案1】:

正如@forty-2 建议的那样,XMLSerializer 解决了这个问题:

var xml = '<xml xmlns="http://www.w3.org/1999/xhtml">' 
  + (new XMLSerializer).serializeToString(dom) 
  + '</xml>'

这会将不间断空格字符直接插入结果中。 (没有“&”字符。) 读取端无需更改。 谢谢。

【讨论】:

以上是关于将特殊的 HTML 字符插入 XML的主要内容,如果未能解决你的问题,请参考以下文章

xml特殊字符处理

如何转义xml中的特殊字符

如何使用mysql insert 插入特殊字符?

在 python 中,将数据插入 SQL Server 时如何转义特殊字符?

XML 特殊字符处理和 CDATA

oracle 插入所有通配符 转义字符 特殊符号