PHP解析SOAP XML:提取status与itens/seloRecebimento内容并格式化
提取SOAP XML中的状态值与印章信息并整理为表格
我来帮你完善代码,精准提取目标数据并按要求输出。你的原始代码只是把节点文本拼接在一起,没有结构化提取,我们来调整一下:
完整解决方案代码
$string = '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns4:receberSelosResponse xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" xmlns:ns3="http://www.tjce.jus.br/selodigital/schemas" xmlns:ns4="http://service.recebimento.selodigital.tjce.jus.br/"> <return> <cabecalho> <versao>1.12</versao> <dataHora>2019-12-30T08:17:17.425-03:00</dataHora> <ambiente>2</ambiente> <serventia> <codigoServentia>000309</codigoServentia> </serventia> </cabecalho> <itens> <itemSolicitacao> <sequencial>1</sequencial> <status> <codigo>MSG037</codigo> <status>0</status> <mensagem>Item da solicitação já foi entregue para serventia.</mensagem> </status> <seloRecebimento> <codigoSelo> <codigo>4</codigo> </codigoSelo> <numeroSerie>AAA034593</numeroSerie> <validador>A1B2</validador> </seloRecebimento> <seloRecebimento> <codigoSelo> <codigo>4</codigo> </codigoSelo> <numeroSerie>AAA034594</numeroSerie> <validador>A1B2</validador> </seloRecebimento> </itemSolicitacao> </itens> </return> </ns4:receberSelosResponse> </soap:Body> </soap:Envelope>'; // 初始化DOM解析器,抑制命名空间相关警告 $domDocument = new DOMDocument(); libxml_use_internal_errors(true); $domDocument->loadXML($string); libxml_clear_errors(); // 提取目标状态值到$status $status = null; $statusContainers = $domDocument->getElementsByTagName('status'); foreach ($statusContainers as $container) { // 找到嵌套在容器内的<status>子节点(值为0/1的目标节点) $targetStatus = $container->getElementsByTagName('status')->item(0); if ($targetStatus instanceof DOMElement) { $status = $targetStatus->textContent; break; // 找到后直接退出循环,避免多余遍历 } } // 提取所有印章信息并结构化存储 $selosList = []; $seloNodes = $domDocument->getElementsByTagName('seloRecebimento'); foreach ($seloNodes as $selo) { // 逐个提取印章的三个字段 $codigo = $selo->getElementsByTagName('codigo')->item(0)->textContent; $numeroSerie = $selo->getElementsByTagName('numeroSerie')->item(0)->textContent; $validador = $selo->getElementsByTagName('validador')->item(0)->textContent; $selosList[] = [ 'codigo' => $codigo, 'numeroSerie' => $numeroSerie, 'validador' => $validador ]; } // 输出结果 echo "提取的状态值 \$status: {$status}\n\n"; // 输出Markdown格式的表格 echo "### 印章信息表格\n"; echo "| 代码 | 序列号 | 验证码 |\n"; echo "|------|--------|--------|\n"; foreach ($selosList as $selo) { echo "| {$selo['codigo']} | {$selo['numeroSerie']} | {$selo['validador']} |\n"; } // 输出你示例中的纯文本格式 echo "\n### 纯文本格式输出\n"; foreach ($selosList as $selo) { echo "{$selo['codigo']} {$selo['numeroSerie']} {$selo['validador']} "; } echo "\n";
代码关键点说明
- 抑制XML警告:因为SOAP XML包含多个命名空间,解析时会产生无关警告,用
libxml_use_internal_errors(true)可以屏蔽这些干扰。 - 精准提取状态值:XML里有两层
<status>节点,外层是状态容器,内层才是值为0/1的目标节点,所以需要嵌套查找。 - 结构化存储印章数据:把每个印章的三个字段存为数组,后续可以灵活输出成表格或纯文本格式。
- 两种输出格式:既提供了清晰的Markdown表格,也保留了你示例中的纯文本拼接格式,按需使用即可。
内容的提问来源于stack exchange,提问作者Groot
相关产品推荐
相关产品推荐

