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

PHP中字符串转XML及simplexml_load_file解析WebService转义XML失败的技术求助

解决simplexml解析嵌套转义XML的问题

我完全懂你的困扰——调用WebService返回的XML里,真正的licensee数据被转成HTML实体后塞进了<string>节点里,直接解析外层XML根本拿不到内部的属性。别慌,下面给你一套靠谱的解决流程:

核心思路

  1. 先解析外层XML,提取<string>节点里的转义文本
  2. 对转义文本做HTML实体解码,还原成正常的XML结构
  3. 再解析还原后的XML,就能正常遍历属性了

完整代码示例

// 加载WebService返回的外层XML
$outerXml = simplexml_load_file('你的WebService请求地址');

// 处理<string>节点的命名空间(这步很关键!)
$targetNamespace = 'http://www.cebroker.com/CEBrokerWebService/';
// 提取<string>节点里的转义XML内容
$escapedXmlContent = (string)$outerXml->children($targetNamespace)->string;

// 解码HTML实体,还原成可解析的XML字符串
$decodedXml = htmlspecialchars_decode($escapedXmlContent);

// 解析还原后的XML
$xml_string = simplexml_load_string($decodedXml);

// 现在就能正常遍历licensee的属性了
foreach ($xml_string->licensee[0]->attributes() as $attributeName => $attributeValue) {
    echo $attributeName . '=' . $attributeValue . '<br>';
}

关键细节说明

  • 命名空间处理:外层<string>节点带了xmlns命名空间,直接用$outerXml->string会拿不到内容,必须通过children()方法指定命名空间才能访问到节点文本。
  • 实体解码:htmlspecialchars_decode()会自动处理所有标准HTML实体(比如&lt;转成<,&gt;转成>),比手动写str_replace更全面可靠,不会遗漏转义字符。
  • 类型转换:把SimpleXMLElement对象强制转成字符串((string)),才能拿到节点内的纯文本内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:27:43