记录一下那天晚上的排查过程。为了兼容带 & 的地址,生成脚本把每个 loc 都包进 CDATA。Google 能读,Bing 后台直接报无效的 XML,整份文件被拒,收录一周没有新增。

刚开始盯着「同一份文件里混用 CDATA 和实体,结构不一致」,折腾了半个多小时,排掉了。

排查方向其实有限,先把可能性排一排。sitemap 协议要求 loc 里用实体转义而不是 CDATA 段。还有一种是CDATA 包裹后解析器把尖括号也当内容,地址对不上。

不容易想到的是,文件头声明与编码不匹配,解析在中途中断。

上来先抽出几条 loc 看写法

curl -s https://www.example.com/sitemap.xml | grep -m5 '<loc>'

随后改成实体转义输出

url = url.replace('&', '&amp;').replace('<', '&lt;')

接着用 xmllint 校验整份文件

xmllint --noout sitemap.xml

等前面都确认过,再重新提交到 Bing 后台观察

https://www.bing.com/webmasters/

别只看报错消失,验证要多做一步。xmllint 无报错,Bing 状态从无效变成成功,带参数的地址也能被正确识别。

这里还有个坑。XML 里 CDATA 不是万能转义,sitemap 解析器对它的兼容性差别很大,老老实实用实体最稳。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189