如何正确将 RSS Feed(含 iTunes 扩展标签)转换为 JSON

2026-01-30 00:00:00 作者:聖光之護

php 使用 `simplexml_load_stri

ng()` 解析 rss 时,默认无法识别带冒号的命名空间标签(如 ``),导致数据丢失;需预处理 xml 字符串,将 `:` 替换为 `_` 以生成合法 php 属性名,再转 json。

RSS Feed 常包含来自不同命名空间的扩展元素,其中 iTunes Podcast 标准广泛使用 标签(如 、、 等)。然而,PHP 的 SimpleXML 扩展在将 XML 转为对象时,不支持属性名或节点名中包含冒号(:)——因为 : 在 PHP 变量/属性命名中非法,导致这些节点被静默忽略,最终 JSON 输出中完全缺失。

你原始代码中的问题不仅在于 str_replace(array("\n", "\r", "\t"), '', $fileContents) 这类格式化替换(虽非主因),更关键的是未处理命名空间前缀。而答案中给出的修复方案简洁有效:在加载 XML 前,全局将 : 替换为 _,使 变为 ,从而让 SimpleXML 能正确解析并映射为可序列化的对象属性。

✅ 正确实现如下:

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 的通用且高效实践。

猜你喜欢

联络方式:

400 9058 355

邮箱:8955556@qq.com

Q Q:8955556

微信二维码
在线咨询 拨打电话

电话

400 9058 355

微信二维码

微信二维码