使用以下字符 £ ' – 的 XML 无效

本文关键字:XML 无效 字符 | 更新日期: 2023-09-27 17:55:26

我正在尝试创建一个将使用W3C验证器进行验证的RSS提要。我不断从以下包含字符的 URL 中遇到问题 £`-

以下是网址:

http://www.example.co.uk/news/2012/april/stamp-rationing-–-why-the-royal-mail-are-ripping-you-off

这是错误:

此源不会验证。第 14 行,第 119 列:链接必须是完整且有效的 URL:http://www.example.co.uk/news/2012/april/stamp-rationing---为什么皇家邮件是撕裂你 [帮助]... --为什么皇家邮件正在撕毁你

我尝试用转义字符替换符号,但这不起作用。以下是我一直使用的转义字符:

 Text = Text.Replace("-", "&#45");
            Text = Text.Replace("£", "%C2%A");
            Text = Text.Replace("`", "%60");
            Text = Text.Replace("’", "%60");  

有没有人知道如何解决这个问题?以下是导致我问题的更多链接:

http://www.example.co.uk/news/2012/march/for-sale-3-bed-detached-london-home-15,000英镑

错误:

此源不会验证。第 14 行,第 106 列:链接必须是完整且有效的 URL:http://www.example.co.uk/news/2012/march/for-sale-3-bed-detached-london-home-£15,000 [帮助]... -销售-3床-独立-伦敦-家-£15,000

使用以下字符 £ ' – 的 XML 无效

RSS 中发布 URL 之前,您需要对 URL 进行 URL 编码:

var encoded = HttpUtility.UrlEncode(aUrl);

请注意,URL将不能直接使用,因为:/等也会被编码。

如果希望这些值是有效的 XML,请改用SecurityElement.Escape

var escaped = SecurityElement.Escape(aUrl);

我正在为我的系统构建一个 API,我一直在使用一些东西来规范化字段。尝试使用 PHP 过滤它:

$value = preg_replace('/[^a-z]/i', '', $value);
$value = preg_replace('/[^'x09'x0A'x0D'x20-'x7F]/e', '"&#".ord($0).";"', $value);
$value = htmlentities($value, ENT_NOQUOTES, 'UTF-8', false);

答案是使用 UTF-8 编码或将非 ASCII 字符转换为 XML 实体。

    UTF-8
  • 编码:确保文档以 UTF-8 格式输出,并包含相关的编码标头。

    另请参阅 PHP 中的 UTF-8 编码 xml

  • 实体编码:将所有非 ASCII 字符转换为 XML 实体。

    XML 实体如下所示:£(该实体用于£符号)。大多数编程语言将在您生成 XML 文档时自动执行此操作,或者提供用于执行此操作的标准函数。您没有指定所使用的语言,但上述内容应该可以帮助您找到合适的 API 函数。

不应该做的一件事是手动生成 XML 数据(即输出标记和属性,作为字符串),或手动替换实体的字符串。您应该为其使用正确的 API。手动生成XML(或任何其他标准数据格式)总是可能以这样的问题告终,如果工具就在您面前以正确的方式执行此操作似乎有点疯狂。