如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?

Posted

技术标签:

【中文标题】如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?【英文标题】:How do I escape ampersands in XML so they are rendered as entities in HTML? 【发布时间】:2010-11-22 15:32:32 【问题描述】:

我有一些希望在 html 页面中呈现的 XML 文本。此文本包含一个 & 符号,我想在其实体表示中呈现它:&

如何在源 XML 中转义这个 & 符号?我尝试了&,但它被解码为实际的与号字符(&),即invalid in HTML。

所以我想以这样一种方式对其进行转义,使其在使用 XML 输出的网页中呈现为&

【问题讨论】:

在此问题的最新版本中声称 “实际的 & 符号 (&) ... 在 HTML 中无效。” 是错误的。事实上,即使是作为理由提供的链接问题的公认答案也表明 “HTML5 允许您不转义,但仅当后面的数据看起来不像有效的字符引用时” 【参考方案1】:

当您的 XML 包含 & 时,这将导致文本 &

当您在 HTML 中使用它时,它将呈现为 &

【讨论】:

这如何回答这个问题?【参考方案2】:

根据§2.4 of the XML 1.0 spec,您应该可以使用&

我试过 &但这是不允许的。

你确定这不是一个不同的问题吗? XML 明确将此定义为转义 & 符号的方式。

【讨论】:

这在发布时是完全合理的,但是对问题的更改(或者可能是澄清)使它看起来像一个答案是荒谬的。一方面,引用的段落不再出现在问题中。【参考方案3】:

& 字符本身是 XML 中的转义字符,因此解决方案是将它与 & 的 Unicode 十进制等效字符连接起来,从而确保没有 XML 解析错误。也就是说,将字符 & 替换为 &

【讨论】:

我真的更喜欢这个解决方案!也应该可以使用十六进制表示法:& 从逻辑上讲,为什么会这样?两个字符串都有一个 & 符号,包括末尾带有字符代码的字符串... @sijpkes 因为这里的&符号告诉解析器以下字符用于表示另一个字符,在这种情况下是&符号。 & 符号在 XML 中并不是“非法的”——它只是具有特殊含义。这意味着“在您点击分号之前的所有字符都应该被翻译成别的东西”。当你通常有一个&符号,没有描述性字符和尾随分号时,解析器会感到困惑。 这就是我的答案。添加 &在我的响应标头的位置中修复了它,并且没有在响应标头上显示与号。 :D Stack Overflow 太棒了。这是一篇将近 11 年的帖子,它解决了我的问题。它的浏览量已超过 690,000 次。【参考方案4】:

使用CDATA标签:

 <![CDATA[
   This is some text with ampersands & other funny characters. >>
 ]]>

【讨论】:

这是猜测而非答案。 这可能是一个猜测;这是正确的。 CDATA 标记允许使用原始 & 符号。 原始帖子从未明确说明 & 的使用位置,CDATA 标签不能用于属性值,只能用于标签的实际内容,因此我包含了“?”。 这对于表征 xml 数据也非常有用,并且这个答案在许多其他有关 xml 呈现的场景中很有帮助。对我来说,它在 Camel XML DSL 中确实很有帮助,当我需要使用一些 XML 数据设置正文或某些标头时,Camel XML 解析器会忽略 CDATA 内容,将它们作为字符流读取。没有这个,骆驼引擎会抛出无效的 xml 结构异常 这正是我需要的答案,因为在我的情况下,我不确定 XML 中可能包含哪些字符,所以我需要转义该部分中的所有内容。【参考方案5】:

&amp;amp; 应该可以正常工作。 Wikipedia has a list of predefined entities in XML.

【讨论】:

【参考方案6】:

就我而言,我必须将其更改为 %26

我需要在 URL 中转义 &amp;amp;。所以&amp;amp; 不适合我。 urlencode 函数将&amp;amp; 更改为%26。这样,XML 和浏览器 URL 机制都不会抱怨 URL。

【讨论】:

是的。请注意,虽然 OP 是关于在 XML 中转义。在 URL 中转义是一个不同的问题。当您在 XML 中拥有 URL 或在 URL 中拥有 XML 片段时,真正的乐趣就开始了...... urlencode() 在什么环境下? In php?【参考方案7】:

我尝试过 &amp,但没有成功。基于Wim ten Brink's answer,我尝试了 &amp 并且成功了。

我的一位开发人员建议我使用 &并且无论渲染多少次都有效。

【讨论】:

分号呢?代码格式可用于解决此处的格式问题(但也可以不使用 - 使用“讽刺”格式)。【参考方案8】:

&amp;amp; 是在 XML 文档的大多数部分中表示 & 符号的方式。

如果您想在 HTML 中显示 XML,您需要首先创建正确编码的 XML(这涉及将 &amp;amp; 更改为 &amp;amp;)然后然后使用它来创建正确编码的 HTML(这涉及再次将&amp;amp; 更改为&amp;amp;)。结果是:

&amp;amp;

有关 XML 编码的更详尽解释,请参阅:

What characters do I need to escape in XML documents?

【讨论】:

【参考方案9】:

&lt;xsl:text disable-output-escaping="yes"&gt;&amp;amp;&amp;nbsp;&lt;/xsl:text&gt; 可以解决问题。

【讨论】:

【参考方案10】:

考虑一下您的 XML 是否如下所示。

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES<>'GCF'
  <Query>
</Employees>

您不能直接使用&lt;&gt;,因为它会引发错误。在这种情况下,您可以使用&amp;#60;&amp;#62; 代替它。

<Employees Id="1" Name="ABC">
  <Query>
    SELECT * FROM EMP WHERE ID=1 AND RES &#60;&#62; 'GCF'
  <Query>
</Employees>

14.1 How to use special characters in XML 有所有的代码。

【讨论】:

我认为在发布此答案之前的 7 年里,这一领域已经得到了很好的覆盖。

以上是关于如何在 XML 中转义 & 符号,以便将它们呈现为 HTML 中的实体?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 freemarker 模板处理中转义 unicode 符号?

在 PL/SQL Developer 中转义 & 符号

有没有办法在 xml 中转义 CDATA 结束令牌?

我需要在 XML 文档中转义哪些字符?

在 SQL 字符串中转义 & 字符

为啥必须在 XML 属性中转义 <?