如何忽略XML文件中的stdClass Object?XMLReader读取报错求助
解决Soap响应生成的XML文件包含
stdClass Object包裹导致XMLReader报错的问题 问题根源
你现在的问题核心出在用print_r()处理Soap响应对象——print_r()是专门用来调试输出对象结构的工具,它会把stdClass对象的格式标记(比如stdClass Object (和末尾的))也写入文件,导致最终的xmlFile.xml根本不是合法的XML文档。XMLReader读取这种不符合规范的文件时,就会抛出错误(错误提示看起来像是路径问题,但实际是文件内容不合法)。
解决方案
直接提取Soap响应对象里的纯XML内容,完全不需要用print_r()来转换:
原来的代码中,$res->ExecuteQueryResult就是你需要的完整XML字符串,直接把它写入文件即可,修改后的代码如下:
$soap = new \SoapClient($request, $options); $res = $soap->ExecuteQuery(['query' => $xmlQuery]); $fileOpen = realpath(dirname(__FILE__) . '/..') . '/xmlFile.xml'; $fil = fopen($fileOpen, "w"); // 建议用"w"模式覆盖文件,避免多次执行后出现多个XML根节点导致文件无效 fwrite($fil, $res->ExecuteQueryResult); // 直接写入干净的XML内容 fclose($fil);
额外提醒
- 如果需要保留历史数据,不要用
"a"追加模式,因为多个独立的XML片段会导致文件出现多个根节点,仍然无法被XMLReader正常解析。可以考虑每个请求生成单独的XML文件,或者把所有XML片段包裹在一个统一的根节点下。 - 写入前可以用
libxml相关函数验证$res->ExecuteQueryResult的合法性,避免写入本身就有问题的XML内容。
内容的提问来源于stack exchange,提问作者tryAndroid
相关产品推荐
相关产品推荐

