SimpleXML 能读取 CDATA 文本内容但不保留 CDATA 标签,也无法判断文本是否来自 CDATA;需用 DOMDocument 创建或处理 CDATA 节点。

PHP SimpleXML 默认会忽略或自动解码 CDATA 节点的内容,不会原样保留 标签本身,但其中的文本内容通常能正常获取——前提是 XML 解析成功且未被错误转义。
SimpleXML 能读取 CDATA 内容,但不区分 CDATA 和普通文本
SimpleXML 将 CDATA 中的文本当作普通字符数据处理,不提供专门方法判断某段文本是否来自 CDATA。只要 XML 合法,$elem->__toString() 或强制类型转换(如 (string)$elem)就能拿到原始内容。
- 例如:
→Hello 立即学习“PHP免费学习笔记(深入)”;
& world]]>(string)$xml->desc返回"(注意:HTML 符号未被解析,只是字符串)Hello
立即学习“PHP免费学习笔记(深入)”;
& world" - 如果 CDATA 内含非法字符或嵌套未闭合标签,可能导致解析失败或截断,需检查 XML 是否 well-formed
不能直接写入 CDATA,需用 DOM 配合实现
SimpleXML 对象不支持创建 CDATA 节点。若需生成带 CDATA 的 XML,必须切换到 DOMDocument:
- 先用
dom_import_simplexml()把 SimpleXML 元素转为 DOMElement - 再用
$dom->createCDATASection($content)创建节点 - 最后用
$element->appendChild()加入 - 完成后可转回 SimpleXML(可选):
simplexml_import_dom($dom)
常见陷阱与绕过技巧
当接口返回的 XML 明确依赖 CDATA(比如含 HTML、JS 或特殊符号),而你只用 SimpleXML 处理,可能遇到:
- 内容被意外转义:确保源 XML 中 CDATA 确实存在,而不是服务端返回了已 HTML-escaped 的普通文本
-
空值或截断:用
libxml_get_errors()检查解析错误;开启LIBXML_NOCDATA(不推荐)反而会禁用 CDATA 合并,导致更难读取 - 需要保留原始 CDATA 标记:SimpleXML 无法做到,只能改用 DOM 或正则预处理(仅限可信、格式固定的场景)
基本上就这些。SimpleXML 的设计目标是简化常用操作,不是完整 XML 处理器。遇到 CDATA 相关的精细控制需求,DOM 才是正确工具。











