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

PHP中如何获取XML节点内容(不含外层节点标签)

解决SimpleXMLElement输出时去除外层节点标签的问题

嘿,我明白你的需求了——你现在用asXML()输出的内容会带上<y>、<d>这些外层节点标签,但你只想保留节点内部的文本和子元素标签对吧?这事儿好办,咱们换个方式来获取节点内容就行。

问题根源

SimpleXMLElement::asXML()方法会输出包含当前节点本身的完整XML片段,所以才会带上外层的<y>和<d>。要去掉这些外层标签,我们需要只提取节点内部的所有内容(包括文本节点和子元素)。

解决方案1:遍历子节点输出

如果你的节点内部只有元素子节点(没有单独的文本内容),可以直接遍历节点的子元素,逐个输出它们的XML:

<?php 
$string = <<<XML
<a>
 <y> This is <b>text</b> <c>stuff</c> </y>
 <d> This is super <em>code</em>, and we like it ! <b>FOObarr</b> ! </d>
</a>
XML;

$xml = new SimpleXMLElement($string); 

foreach ($xml as $node) {
    // 遍历当前节点的所有子元素,输出它们的XML
    foreach ($node->children() as $child) {
        echo $child->asXML();
    }
    echo "\n--\n"; 
} 
?>

不过这个方法有个小局限:如果节点内部有单独的文本内容(比如<y>里的"This is "),这种方式会漏掉文本部分。所以更通用的方法是用DOM和SimpleXML的互操作。

解决方案2:DOM互操作获取完整内部内容

SimpleXML和DOM是可以无缝转换的,我们可以把SimpleXMLElement转成DOM节点,然后提取它的所有子节点内容:

<?php 
$string = <<<XML
<a>
 <y> This is <b>text</b> <c>stuff</c> </y>
 <d> This is super <em>code</em>, and we like it ! <b>FOObarr</b> ! </d>
</a>
XML;

$xml = new SimpleXMLElement($string); 

foreach ($xml as $node) {
    // 把SimpleXML节点转成DOM节点
    $domNode = dom_import_simplexml($node);
    $innerContent = '';
    // 遍历所有子节点(包括文本和元素),拼接它们的XML
    foreach ($domNode->childNodes as $child) {
        $innerContent .= $domNode->ownerDocument->saveXML($child);
    }
    // 可选:trim去掉首尾多余的空白
    echo trim($innerContent);
    echo "\n--\n"; 
} 
?>

简化版(PHP 8.0+)

如果你用的是PHP 8.0及以上版本,DOMElement新增了innerHTML属性,可以直接获取节点内部的所有内容,代码会更简洁:

foreach ($xml as $node) {
    $domElement = dom_import_simplexml($node);
    echo trim($domElement->innerHTML);
    echo "\n--\n";
}

输出结果

不管用哪种方法,最终输出都会符合你的期望:

This is <b>text</b> <c>stuff</c>
--
This is super <em>code</em>, and we like it ! <b>FOObarr</b> !
--

内容的提问来源于stack exchange,提问作者Cedric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:20:08