SimpleXML 能读取 CDATA 文本内容但不保留 CDATA 标签,也无法判断文本是否来自 CDATA;需用 DOMDocument 创建或处理 CDATA 节点。
PHP SimpleXML 默认会忽略或自动解码 CDATA 节点的内容,不会原样保留 标签本身,但其中的文本内容通常能正常获取——前提是 XML 解析成功且未被错误转义。
SimpleXML 将 CDATA 中的文本当作普通字符数据处理,不提供专门方法判断某段文本是否来自 CDATA。只要 XML 合法,$elem->__toString() 或强制类型转换(如 (string)$elem)就能拿到原始内容。
Hello & world]]> → (string)$xml->desc 返回 "Hello
& world"(注意:HTML 符号未被解析,只是字符串)SimpleXML 对象不支持创建 CDATA 节点。若需生成带 CDATA 的 XML,必须切换到 DOMDocument:
dom_import_simplexml() 把 SimpleXML 元素转为 DOMElement$dom->createCDATASection($content) 创建节点$element->appendChild() 加入simplexml_import_dom($dom)
当接口返回的 XML 明确依赖 CDATA(比如含 HTML、JS 或特殊符号),而你只用 SimpleXML 处理,可能遇到:
libxml_get_errors() 检查解析错误;开启 LIBXML_NOCDATA(不推荐)反而会禁用 CDATA 合并,导致更难读取
无法做到,只能改用 DOM 或正则预处理(仅限可信、格式固定的场景)基本上就这些。SimpleXML 的设计目标是简化常用操作,不是完整 XML 处理器。遇到 CDATA 相关的精细控制需求,DOM 才是正确工具。