You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:42:15