PHP中字符串转XML及simplexml_load_file解析WebService转义XML失败的技术求助
解决simplexml解析嵌套转义XML的问题
我完全懂你的困扰——调用WebService返回的XML里,真正的licensee数据被转成HTML实体后塞进了<string>节点里,直接解析外层XML根本拿不到内部的属性。别慌,下面给你一套靠谱的解决流程:
核心思路
- 先解析外层XML,提取
<string>节点里的转义文本 - 对转义文本做HTML实体解码,还原成正常的XML结构
- 再解析还原后的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实体(比如<转成<,>转成>),比手动写str_replace更全面可靠,不会遗漏转义字符。 - 类型转换:把SimpleXMLElement对象强制转成字符串(
(string)),才能拿到节点内的纯文本内容。
内容的提问来源于stack exchange,提问作者Henry Geiter
相关产品推荐
相关产品推荐

