PHP提取XML中CDATA内容有四种方法:一、SimpleXML配合LIBXML_NOCDATA与正则提取;二、DOMDocument识别XML_CDATA_SECTION_NODE节点;三、XMLReader直接读取value属性;四、预处理替换占位符再还原。

如果您在PHP中解析XML文档时需要提取CDATA区域内的原始文本内容,则可能是由于默认的XML解析器会将CDATA视为普通文本节点而忽略其特殊标记。以下是实现PHP接收XML CDATA内容的多种方法:
一、使用SimpleXML配合libxml_disable_entity_loader
SimpleXML在默认配置下可能无法正确保留CDATA内容,需配合libxml扩展的特定选项启用CDATA支持,并通过自定义处理函数提取值。该方法适用于结构较清晰、CDATA嵌套层级不深的XML文档。
1、调用libxml_disable_entity_loader(false)确保外部实体加载正常(注意安全性)。
2、使用simplexml_load_string()加载XML字符串,并传入SIMPLEXML_LOAD_STRING常量与LIBXML_NOCDATA标志。
立即学习“PHP免费学习笔记(深入)”;
3、对含CDATA的节点调用asXML()方法获取完整XML片段,再用正则提取CDATA内部文本。
4、使用preg_match('//s', $xmlFragment, $matches)捕获CDATA内内容。
5、返回$matches[1]作为纯净的CDATA文本值。
二、使用DOMDocument启用CDATA保留模式
DOMDocument可通过设置preserveWhiteSpace为false并结合loadXML的选项强制识别CDATA节点类型,从而直接访问其内容。该方式能准确区分CDATASection节点与Text节点。
1、实例化DOMDocument对象。
2、设置$dom->preserveWhiteSpace = false以减少空白节点干扰。
3、调用$dom->loadXML($xmlString, LIBXML_NOCDATA)加载源XML。
4、遍历目标元素的childNodes,判断每个节点的nodeType是否等于XML_CDATA_SECTION_NODE(值为4)。
5、对匹配节点读取其nodeValue属性,该属性值即为CDATA包裹的原始未转义内容。
还木有评论哦,快来抢沙发吧~