RSS是基于XML格式的订阅内容标准,当我们需要在RSS的描述字段中添加HTML格式的内容时,直接使用HTML标签会导致XML解析失败,这时候CDATA就成为了重要的解决方案。CDATA的全称是Character Data,即字符数据,是XML中用于标记不需要被解析器解析的文本区域。

什么是CDATA
在XML规范中,解析器会把标签内的内容按照XML语法进行解析,如果内容中包含<、>、&这类XML特殊字符,就会被判定为语法错误。CDATA的作用就是把包含这些特殊字符的文本包裹起来,告诉解析器这段内容不需要解析,直接当作普通文本处理。
CDATA的语法格式固定为:
<![CDATA[ 这里是需要原样保留的内容,可以包含<、>、&等XML特殊字符 ]]>
需要注意,CDATA不能嵌套使用,也不能出现在XML注释或者处理指令内部。
为什么RSS描述中需要用到CDATA
RSS的
<description>
<p>今日新闻要点:<a href="https://ipipp.com/news">点击查看详情</a></p>
</description>
解析器会把<p>、<a>当成XML标签解析,而实际上这些是我们希望保留的HTML内容,就会出现解析错误,导致RSS订阅无法正常显示。
使用CDATA包裹后,解析器会把整个HTML内容当作普通字符处理,不会尝试解析其中的标签,从而保证内容的正确性。
在RSS描述中正确使用CDATA的方法
基本使用方式
把需要包含的HTML内容直接放在CDATA标记内部即可,示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>示例RSS频道</title>
<link>https://ipipp.com/rss</link>
<description>这是一个测试RSS频道</description>
<item>
<title>测试文章标题</title>
<link>https://ipipp.com/article/1</link>
<description>
<![CDATA[
<p>这是文章摘要内容,包含<strong>加粗</strong>和<a href="https://ipipp.com/detail">跳转链接</a></p>
]]>
</description>
</item>
</channel>
</rss>
不同生成场景的示例
PHP生成RSS时使用CDATA
在PHP中拼接RSS内容时,只需要把HTML内容包裹到CDATA标记中即可:
<?php
$htmlContent = '<p>文章摘要内容,包含<em>斜体</em>效果</p>';
$rssItem = '
<item>
<title>PHP生成的RSS项</title>
<link>https://ipipp.com/php-rss</link>
<description><![CDATA[' . $htmlContent . ']]></description>
</item>
';
echo $rssItem;
?>
Python生成RSS时使用CDATA
使用Python的第三方库生成RSS时,同样可以直接拼接CDATA标记:
html_content = '<p>Python生成的RSS内容,包含<span style="color:red">红色文本</span></p>'
rss_item = f'''
<item>
<title>Python生成的RSS项</title>
<link>https://ipipp.com/python-rss</link>
<description><![CDATA[{html_content}]]></description>
</item>
'''
print(rss_item)
注意事项
- CDATA只能用于XML格式的内容中,RSS是基于XML的,所以适用,但JSON格式的订阅内容不需要使用CDATA。
- CDATA的结束标记是
]]>,如果HTML内容中本身包含这个字符串,需要提前做替换处理,否则会导致CDATA提前结束。 - 部分老的RSS阅读器可能对CDATA的支持不完善,如果遇到兼容性问题,也可以考虑对HTML内容进行XML实体转义,比如把<转成<,>转成>,但这种方式会导致HTML标签在部分阅读器中无法渲染,只能显示为纯文本。
总结
CDATA是XML中用于保留特殊字符的重要机制,在RSS描述中嵌入HTML内容时,使用CDATA可以简单高效地避免XML解析错误,同时保证HTML内容能够被支持HTML渲染的RSS阅读器正常展示。开发者只需要按照固定语法把HTML内容包裹到CDATA标记中即可,不需要做复杂的转义处理,是RSS生成场景下处理HTML内容的最优方案。