【问题标题】:xml not well-formed because a special character inside CDATAxml 格式不正确,因为 CDATA 中有一个特殊字符
【发布时间】:2020-07-19 14:52:17
【问题描述】:

我有这个 xml:

<?xml version="1.0" encoding="UTF-8" ?>
            <rss xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/1.2/" version="2.0">
                <channel>
                    <wp:wxr_version>1.2</wp:wxr_version>
            <item>
                        <title type="html">
                        <![CDATA[ <h1 class="title">“Title with special character”</h1> ]]>
                        </title>
                        <content:encoded type="html">
                        <![CDATA[ <div class="content clearfix">
            <p>Content Example Text</p>
        </div> ]]>
                        </content:encoded>
                        <wp:post_id>0</wp:post_id>
                        <wp:post_date>2000-09-30T10:22:00.001Z</wp:post_date>           
                    </item>
                </channel>
            </rss>

在 html 标题标签内有 unicode 字符:U+0007

为什么xml无效?

我正在使用 CDATA,这不应该使它有效吗?

如何在构造 xml 之前验证哪些符号无效并删除它们?

【问题讨论】:

  • 您的问题得到解答了吗?如果是这样,请accept 提供您认为最有帮助的答案。谢谢。

标签: xml utf-8 symbols xml-validation


【解决方案1】:

让我们明确一点,我们正在讨论 XML 是否为 well-formed rather than invalid

U+0007 是一个控制字符 (BEL),过去用于使终端发出哔哔声。它在 XML 中是不允许的,即使在 CDATA 中也是如此。如果它在数据中,那么数据就不是 XML。您的选择是删除它或对其进行编码,使其不直接存在于数据中(以便接收者了解如何对其进行解码);对于必须能够表示此类非法字符的任何元素的内容,一种编码选项是 Base64。

另见


XML 1.0 与 1.1

Michael Kay helpfully commented 表示 XML 1.1 允许在 XML 1.0 中允许的字符之外的其他字符,包括 U+0007 (&amp;#x07;)。

例如,考虑以下文档1

<?xml version="1.0" encoding="UTF-8" ?>
<r>
  <e1></e1>  <!-- e1 contains a literal U+0007 char -->
  <e2>&#x07;</e2>  <!-- &#x07; becomes a U+0007 char -->
  <e3><![CDATA[]]></e3>  <!-- e3 CDATA contains a literal U+0007 char -->
  <e4><![CDATA[&#x07;]]></e4>  <!-- &#x07; remains an uninterpreted string -->
</r>

在 XML 声明中使用 XML 1.0 版本设置:

  • e1e2e3 中的 U+0007 字符会阻止 XML 格式正确

在 XML 声明中使用 XML 1.1 版本设置:

  • 仅在 e1e3 中的 U+0007 字符会阻止 XML 格式正确

1 请注意,问题源(可通过问题上的编辑链接查看)确实包含文字 U+0007 字符,即使格式化的 XML 没有。

【讨论】:

  • 一个警告:这个字符在 XML 1.1 中是允许的,但它必须被转义,例如如&amp;#x07; 我不记得是否允许在 CDATA 部分中未转义。但是,要使用它,XML 声明必须更改为 version="1.1",如果您这样做,那么许多 XML 解析器将拒绝该文档,尤其是那些来自像 Microsoft 等没有跟踪 W3C 标准的公司的文档。跨度>
  • @MichaelKay:好点子!答案已更新。谢谢。
  • &lt;e4&gt;中,我认为文本节点的字符串值是6个字符的字符串&amp;#x07;,而不是包含BEL的单字符字符串。
  • @MichaelKay:是的,根据CDATA sections 的语义,无论 XML 1.0 还是 1.1,都不会解释实体。因此,e4 不应该被列为阻止 XML 1.0 格式正确。已更正。谢谢。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多