使用PHRETS无法获取STANDARD-XML格式的DDF数据
问题
我们通过DDF数据源获取默认COMPACT-Decoded格式的数据一切正常,但根据文档,部分数据仅能通过STANDARD-XML格式获取。当请求STANDARD-XML格式数据时,无法得到任何记录。使用的是最新版PHRETS库,测试代码如下:
public function test() { $this->connect(); return $this->rets->Search( 'Property', 'Property', 'ID=26352397', ['Limit' => 1, 'Format' => 'STANDARD-XML'] ); }
调用该函数的代码:
$value = $this->ddfService->test(); $io->success(var_export($value->toArray(), true));
返回结果为空数组。请问遗漏了什么?还有其他获取这些字段的方法吗?
更新:相关日志如下:
[2024-01-17T20:26:54.674761+00:00] PHRETS.DEBUG: 加载Monolog\Logger日志器 [] [] [2024-01-17T20:26:54.675622+00:00] PHRETS.DEBUG: 发送HTTP请求至https://data.crea.ca/Login.svc/Login (登录) {"auth":["qeoMsug6JDuY5VrxNT3CZJGq","S0uuYshvCPegrzypREFO4gdN","digest"],"headers":{"User-Agent":"PHRETS/2.6.4","RETS-Version":"RETS/1.7.2","Accept-Encoding":"gzip","Accept":"*/*"},"curl":{"10031":"/private/tmp/phrets6LOrCo"}} [] [2024-01-17T20:26:55.385730+00:00] PHRETS.DEBUG: 响应:HTTP 200 [] [] [2024-01-17T20:26:55.397311+00:00] PHRETS.DEBUG: 发送HTTP请求至https://data.crea.ca/Search.svc/Search (搜索) {"auth":["qeoMsug6JDuY5VrxNT3CZJGq","S0uuYshvCPegrzypREFO4gdN","digest"],"headers":{"User-Agent":"PHRETS/2.6.4","RETS-Version":"RETS/1.7.2","Accept-Encoding":"gzip","Accept":"*/*"},"curl":{"10031":"/private/tmp/phretsqtA0ET"},"query":{"SearchType":"Property","Class":"Property","Query":"(ID=26352397)","QueryType":"DMQL2","Count":1,"Format":"STANDARD-XML","Limit":null,"StandardNames":0}} [] [2024-01-17T20:26:55.612069+00:00] PHRETS.DEBUG: 响应:HTTP 200 [] [] [2024-01-17T20:26:55.632945+00:00] PHRETS.DEBUG: 因响应中未指定分隔符,假设使用TAB分隔符 [] [] [2024-01-17T20:26:55.633008+00:00] PHRETS.DEBUG: 给出1个列头/字段 [] [] [2024-01-17T20:26:55.633047+00:00] PHRETS.DEBUG: 共找到1条结果 [] [] [2024-01-17T20:26:55.633068+00:00] PHRETS.DEBUG: 返回0条结果 [] []
排查与解决方案
从日志能看到几个关键信息:请求返回HTTP 200说明服务端接收正常,系统显示找到1条结果但实际返回0条,且PHRETS在处理响应时默认用TAB分隔符解析——这是核心问题:你请求的是STANDARD-XML格式,但PHRETS却按文本分隔格式处理响应,要么是服务端没返回正确的XML,要么是PHRETS识别格式出错。
可以尝试以下步骤解决:
- 强制添加
StandardNames参数:部分RETS服务需要该参数才能正确返回标准格式数据,修改搜索参数:
return $this->rets->Search( 'Property', 'Property', 'ID=26352397', ['Limit' => 1, 'Format' => 'STANDARD-XML', 'StandardNames' => 1] );
- 查看原始响应内容:直接获取服务端返回的原始数据,确认是否为有效XML,可添加调试代码:
// 调用Search后添加 $response = $this->rets->getLastResponse(); var_dump($response->getBody());
如果返回的不是XML而是其他格式,说明服务端不支持该格式或请求参数有误。
换格式获取特殊字段:如果服务端无法返回
STANDARD-XML,可继续用默认的COMPACT-Decoded格式,再通过GetObject接口获取特殊字段对应的资源,或查看RETS元数据找其他获取方式。调整RETS版本:当前请求用的是
RETS/1.7.2,部分服务对STANDARD-XML的支持在不同版本有差异,可尝试切换为RETS/1.5或RETS/1.8后测试。
内容的提问来源于stack exchange,提问作者Alex A.
相关产品推荐
相关产品推荐

