
php 使用 `simplexml_load_string()` 解析 rss 时,默认无法识别带冒号的命名空间标签(如 `
RSS Feed 常包含来自不同命名空间的扩展元素,其中 iTunes Podcast 标准广泛使用
你原始代码中的问题不仅在于 str_replace(array("\n", "\r", "\t"), '', $fileContents) 这类格式化替换(虽非主因),更关键的是未处理命名空间前缀。而答案中给出的修复方案简洁有效:在加载 XML 前,全局将 : 替换为 _,使
✅ 正确实现如下:
function rssToJson($url) {
$fileContents = file_get_contents($url);
// 关键修复:将命名空间分隔符 ':' 替换为 '_',兼容 PHP 属性命名规则
$fileContents = str_replace(':', '_', $fileContents);
$simpleXml = simplexml_load_string($fileContents);
if ($simpleXml === false) {
throw new RuntimeException('Failed to parse RSS XML from ' . $url);
}
return json_encode($simpleXml, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
// 使用示例
try {
$json = rssToJson('https://example.com/feed.rss');
echo $json;
} catch (Exception $e) {
error_log('RSS parsing error: ' . $e->getMessage());
}⚠️ 注意事项:
- 仅替换 : 是最小侵入方案,但需确保 RSS 中无其他语义依赖冒号的场景(实际 RSS/Atom 规范中,冒号仅用于命名空间前缀,安全);
- str_replace(':', '_', $xml) 会同时影响 xmlns:itunes="..." → xmlns_itunes="...",这恰巧使命名空间声明也转为合法属性(如 [@attributes]['xmlns_itunes']),符合预期;
- 若需更高精度(如避免误替换 CDATA 中的 :),可用正则匹配 XML 标签内的 :,但对标准 RSS 场景,全局替换已足够可靠;
- 建议添加错误处理(如 simplexml_load_string 失败检测)和 HTTP 异常捕获(file_get_contents 可能失败),提升健壮性;
- 如需还原标准字段名(如 API 返回时仍要 itunes:subtitle),应在 JSON 后处理阶段做映射,而非 XML 层。
总结:RSS 到 JSON 的转换失败,根源在于 XML 命名空间与 PHP 对象模型的不兼容。通过预处理将 itunes:xxx 统一转为 itunes_xxx,即可无缝桥接二者,完整保留所有扩展字段——这是解析带命名空间 RSS/Atom Feed 的通用且高效实践。










