
本文介绍如何使用 php 解析 guzzle http 客户端获取的 soap xml 响应,通过 domdocument 与 domxpath 安全、准确地提取嵌套命名空间下的业务字段(如 materialcode、quantityavailable 等)。
本文介绍如何使用 php 解析 guzzle http 客户端获取的 soap xml 响应,通过 domdocument 与 domxpath 安全、准确地提取嵌套命名空间下的业务字段(如 materialcode、quantityavailable 等)。
在使用 Guzzle 发送 SOAP 请求后,响应体($res->getBody())返回的是原始 XML 字符串。直接 echo 或 var_dump 只会输出文本内容,无法直接访问结构化数据。必须将 XML 字符串解析为可查询的对象模型,才能按需提取节点值。
推荐使用 PHP 原生的 DOMDocument + DOMXPath 组合,因其对命名空间支持完善、稳定性高,且无需依赖外部扩展(如 simplexml_load_string 在处理带默认命名空间的 SOAP 响应时易出错,需手动注册命名空间)。
以下为完整、健壮的解析示例(已适配你的实际响应结构):
// 假设 $xml1 是 Guzzle 返回的响应体(XML 字符串)
$xmlContent = (string) $res->getBody();
// 创建 DOMDocument 并加载 XML
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false; // 可选:提升可读性与性能
$dom->loadXML($xmlContent);
// 初始化 XPath 查询器
$xpath = new DOMXPath($dom);
// 【关键】注册命名空间 —— SOAP 响应中存在默认命名空间(xmlns="..."),必须显式声明别名
$xpath->registerNamespace('soap', 'http://www.w3.org/2003/05/soap-envelope');
$xpath->registerNamespace('ws', 'http://localhost/EnterpriseWebService/EnterpriseConnect');
// 使用 XPath 定位目标节点(跳过 Envelope/Body,直达业务结果)
$resultNode = $xpath->query('//ws:GetInventoryStatusResult')->item(0);
if (!$resultNode) {
throw new RuntimeException('Failed to locate GetInventoryStatusResult in SOAP response.');
}
// 提取各字段(自动继承父节点命名空间,无需重复前缀)
$data = [
'MaterialCode' => $xpath->evaluate('string(ws:MaterialCode)', $resultNode),
'MaterialDescription' => $xpath->evaluate('string(ws:MaterialDescription)', $resultNode),
'QuantityOnHand' => (float) $xpath->evaluate('string(ws:QuantityOnHand)', $resultNode),
'QuantityAvailable' => (float) $xpath->evaluate('string(ws:QuantityAvailable)', $resultNode),
'QuantityAllocated' => (float) $xpath->evaluate('string(ws:QuantityAllocated)', $resultNode),
];
// 输出结构化数据
print_r($data);
// 示例输出:
// Array (
// [MaterialCode] => 10029
// [MaterialDescription] => 12 PT TANGO C2S
// [QuantityOnHand] => 138000.00
// [QuantityAvailable] => 117600.00
// [QuantityAllocated] => 20400.00
// )
注意事项与最佳实践:
- ✅ 务必注册命名空间:SOAP 响应中的
xmlns="http://..."是默认命名空间,XPath 查询必须通过registerNamespace()显式绑定别名(如'ws'),否则//GetInventoryStatusResult将匹配失败; - ✅ 使用
string()函数:$xpath->evaluate('string(ws:QuantityOnHand)', $context)可安全提取文本值并避免空节点报错; - ⚠️ 错误处理不可省略:SOAP 响应可能包含
<fault></fault>节点,建议在解析前用$xpath->query('//soap:Fault')检查错误; - ? 安全性提示:若
$_GET['matcode']直接拼入 XML,存在 XML 注入风险,应使用htmlspecialchars($matcode, ENT_XML1, 'UTF-8')转义; - ? 替代方案:若偏好简洁语法,可配合
simplexml_load_string()+registerXPathNamespace(),但 DOM 方案在复杂命名空间场景下更可靠。
掌握此方法后,你即可稳定、可维护地从任意符合标准的 SOAP 响应中精准提取业务数据。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











