PHP如何提取SimpleXmlElement对象的完整文本内容
问题现象
直接echo输出SimpleXmlElement对象时,仅能获取根节点下直接存在的文本内容,无法获取包含子节点文本在内的完整拼接文本,复现代码如下:
$div1 = new SimpleXmlElement("<div>hello,<strong>world</strong></div>"); echo $div1;// 输出结果:hello, $div2 = new SimpleXmlElement("<div><strong>hello</strong>,world</div>"); echo $div2;// 输出结果:,world
上述代码预期拿到完整拼接文本hello,world,直接输出无法达成效果。
解决方法
SimpleXML对象直接转字符串时,默认仅返回当前节点的直接文本子节点内容,不会递归遍历后代节点拼接文本,可通过以下两种方法提取全量文本:
方法1:借助内置DOM扩展的
textContent属性(推荐,代码最简洁)
DOM扩展是PHP默认开启的内置扩展,无需额外安装,textContent属性会自动按顺序递归拼接当前节点下所有层级的文本内容:// 处理$div1 $domNode1 = dom_import_simplexml($div1); echo $domNode1->textContent; // 输出:hello,world // 处理$div2 $domNode2 = dom_import_simplexml($div2); echo $domNode2->textContent; // 输出:hello,world方法2:通过XPath查询所有文本节点手动拼接
如果不想转换为DOM对象,可使用XPath语法查询当前节点下所有层级的文本节点,遍历拼接即可:function getAllText(SimpleXMLElement $xmlNode): string { $textArr = []; // .//text() 表示查询当前节点下所有后代节点中的文本节点 foreach ($xmlNode->xpath('.//text()') as $textNode) { $textArr[] = (string)$textNode; } return implode('', $textArr); } echo getAllText($div1); // 输出:hello,world echo getAllText($div2); // 输出:hello,world
注意:直接对SimpleXmlElement对象做字符串强转、直接输出的行为是扩展的既定设计,不属于bug,不要依赖该方式获取包含子节点的全量文本。
内容的提问来源于stack exchange,提问作者peter
相关产品推荐
相关产品推荐

