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

How do I escape ampersands in XML so they are rendered as entities in HTML?

提问人:AJM 提问时间:8/25/2009 最后编辑:lospejosAJM 更新时间:11/11/2021 访问量:837950

问:

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

如何在源 XML 中转义此 & 号?我试过了,但这被解码为实际的 & 字符 (),这在 HTML 中是无效的。&&

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

HTML XML 转义 &

评论

1赞 Mark Amery 9/1/2016
这个问题的最新修订版中声称“实际的 & 字符 (&) ...在 HTML 中无效。是假的。事实上,即使是作为理由提供的链接问题的公认答案也指出“HTML5 允许您将其保留为未转义,但前提是后面的数据看起来不像有效的字符引用”。

答:

219赞 John Feminella 8/25/2009 #1

根据 XML 1.0 规范的 §2.4,您应该能够使用 .&

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

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

评论

5赞 Mark Amery 9/1/2016
这在发布时是完全合理的,但此后对问题的更改(或澄清)使其作为答案看起来很荒谬。首先,引用的段落不再出现在问题中。
57赞 nikc.org 8/25/2009 #2

&应该工作得很好。维基百科有一个XML预定义实体的列表

84赞 scragar 8/25/2009 #3

使用标签:CDATA

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

评论

5赞 Bryan Oakley 8/25/2009
这是一个猜测,而不是一个答案。
10赞 Quentin 8/25/2009
这可能是一个猜测;不过这是正确的。CDATA 标记允许使用原始 & 符号。
19赞 scragar 8/26/2009
原始帖子从未明确说明在哪里使用&,CDATA标签不能用于属性值,只能用于标签的实际内容,因此我包含“?”的原因。
1赞 Kimutai 12/1/2017
这对于表征 xml 数据也非常有用,此答案在许多其他有关 xml 呈现的方案中很有帮助。对我来说,它对Camel XML DSL确实很有帮助,当我需要用一些XML数据设置正文或一些标头时,Camel XML解析器会忽略CDATA内容,将它们作为字符流读取。否则,camel 引擎将抛出无效的 xml 结构异常
2赞 Matt 1/25/2019
这正是我需要的答案,因为就我而言,我不确定 XML 中可能会出现哪些字符,因此我需要转义该部分中的所有内容。
475赞 Wim ten Brink 8/25/2009 #4

当您的 XML 包含 时,这将产生文本 .&amp;amp;&amp;

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

评论

6赞 Peter Mortensen 11/9/2021
这如何回答这个问题?
164赞 trouble 2/9/2011 #5

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

评论

7赞 CodeManX 4/26/2014
我真的很喜欢这个解决方案!也应该可以使用十六进制表示法:&#x26;
2赞 sijpkes 2/25/2016
从逻辑上讲,为什么会这样?两根弦都有一个 & 号,包括末尾带有字符代码的字符串......
7赞 Riley Major 8/30/2016
@sijpkes 因为这里的 & 号告诉解析器以下字符用于表示另一个字符,在本例中为 & 号。与号在XML中并不“非法”,它只是具有特殊的含义。这意味着“在此之后的所有字符,直到你点击分号,都应该翻译成其他东西”。当你通常有一个 & 符号,没有描述性字符和尾随分号时,解析器会感到困惑。
1赞 iamjoshua 8/2/2019
这就是我的答案。添加 &#038;在我的响应标头的位置中修复了它,并且没有在响应标头上显示 & 号。:D
7赞 Bill 5/30/2020
Stack Overflow 太棒了。这是一个将近 11 年的帖子,解决了我的问题。它已被观看超过 690,000 次。
4赞 Rick 3/2/2011 #6

<xsl:text disable-output-escaping="yes">&amp;&nbsp;</xsl:text>会做伎俩。

8赞 mcampos 6/21/2013 #7

我试过了,但没有用。根据 Wim ten Brink 的回答,我尝试了 &amp 它奏效了。

我的一位开发人员同事建议我使用 &#x26;无论它被渲染多少次,这都是有效的。

评论

0赞 Peter Mortensen 11/9/2021
分号呢?代码格式可用于解决此处的格式问题(但也可以不使用 - 使用“讽刺”格式)。
16赞 Serhat Akay 10/25/2013 #8

就我而言,我不得不将其更改为 .%26

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

评论

8赞 Oskar Berggren 11/14/2013
是的。但请注意,OP 是关于在 XML 中转义的。在 URL 中转义是另一个问题。真正的乐趣始于 XML 中的 URL,或者 URL 中的 XML 片段......
0赞 Peter Mortensen 11/9/2021
urlencode() 在什么环境中?在PHP中
7赞 Riley Major 8/30/2016 #9

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

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

&amp;amp;

有关 XML 编码的更详尽说明,请参阅:

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

0赞 Sarath Subramanian 9/17/2016 #10

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

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

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

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

14.1 如何在XML中使用特殊字符具有所有代码。

评论

3赞 miken32 12/4/2019
我认为在这个答案发布之前的 7 年里,这个理由得到了很好的覆盖。