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
相关产品推荐
相关产品推荐

