gpt4 book ai didi

xml - 只要 XHTML 实体编码包含在 CDATA 标记内,它们在 XML 文档中是否有效?

转载 作者:数据小太阳 更新时间:2023-10-29 02:00:04 26 4
gpt4 key购买 nike

这是一个有效的(格式良好的)XML 文档吗?

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner>&copy;</inner>
</outer>

问题在于 HTML/XHTML“©”实体编码在没有 DTD 或模式来定义它的 XML 文档中是否有效。表达上述内容的另一种方式是这样说:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner>&#169;</inner>
</outer>

这似乎是具有 UTF-8 编码的有效 XML。

但这有效吗:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner><![CDATA[&copy;]]></inner>
</outer>

上面的作者打算向XML解析器表明它应该通过上面的版权符号作为字符串“©”而不是作为正确的 Unicode 字符。

在这方面,我发现这句话有点令人困惑:'XML 文档的新作者经常误解 CDATA 部分的用途,错误地认为它的用途是“保护”数据在处理过程中不被视为普通字符数据。 [但是] 字符数据就是字符数据,无论它是通过 CDATA 部分还是普通标记表示。”(来自 Wikipedia)

我正在单独查看第二位作者提出的 XML 格式,该作者已将 每个 标签包装在 CDATA 部分中,即使标签可以,例如,仅包含数字。

希望 XML 大师可以帮助澄清对 CDATA 用途的困惑。

谢谢!

最佳答案

CDATA 部分用于允许在 XML 文档中通常以特殊方式解释的文字文本。即,看起来像实体引用的东西,或者看起来像 XML 标记的东西。 CDATA 部分中的任何内容都可以在没有 CDATA 部分的有效 XML 中;您只需要使用实体引用来对各种特殊字符进行编码,这样它们就不会被视为 XML 标记,而是被视为作为标记值的字符数据。

所以是的,只要符合您的意图,以下内容就完全有效:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner><![CDATA[&copy;]]></inner>
</outer>

此处,inner 元素的值是 © 的值,XML 解析器不会将其解释为版权符号的实体引用。您还可以执行以下操作:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner><![CDATA[<normally> this looks <like/> &amp; xml </normally>]]></inner>
</outer>

inner 元素的值是

<normally> this looks <like/> &amp; xml </normally>

要在没有 CDATA 部分的情况下执行此操作:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner>&lt;normally&gt; this looks &lt;like/&gt; &amp;amp; xml &lt;/normally&gt;</inner>
</outer>

它的人类可读性要差得多,但就 XML 解析器而言是等效的。如果您这样做(假设 inner 元素被定义为包含字符串而不是 XML 的架构或 DTD),那么您的 XML 解析器将提示:

<?xml version="1.0" encoding="UTF-8" ?> 
<outer>
<inner><normally> this looks <like/> &amp; xml </normally></inner>
</outer>

因此您使用 CDATA 或实体转义来保护特殊字符不受 XML 解析器的影响,这样 XML 数据的客户端就可以获取恰好包含 XML 标记字符的 inner 的值。

注意:为了清楚起见,上面的示例是 格式良好 XML,但是如果模式或 DTD 表明元素 inner 包含 xsd:string 或等效项,则这是一个无效 XML 文档。

不,没有定义为 XML 本身的一部分的 HTML 或 XHTML 实体不是有效的 XML,除非它们被定义。您的 XML 解析器将返回错误。

关于xml - 只要 XHTML 实体编码包含在 CDATA 标记内,它们在 XML 文档中是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/664992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com