如何使用 PHRETS 从 RETS 下载 STANDARD-XML 元数据
How to download STANDARD-XML metadata from RETS using PHRETS
是否有使用 PHRETS 从 RETS 下载 STANDARD-XML 元数据的解决方案?
目前我能够使用 PHRETS 函数 GetMetadataTable 将每个 class 元数据提取为数组,并合并并转换为 XML 格式。
但最近我发现了单个 STANDARD-XML 元数据(整个资源和 classes)和单个 class 元数据的差异。同样使用元数据查看器服务 RETSMD.com(基于 PHRETS),从 STANDARD-XML 元数据获取的 class 名称不同,无法查看详细信息。
注意:我通过使用凭据直接登录浏览器获得了 STANDARD-XML 元数据,如下所示
http://rets.login.url/GetMetadata?Type=METADATA-TABLE&Format=STANDARD-XML&ID=0
有人遇到过同样的情况吗?有没有使用PHP的解决方案?
提前致谢!
我通过修改 PHRETS 库得到了解决方案。
使用以下代码添加了一个新功能,
if (empty($this->capability_url['GetMetadata'])) {
die("GetServerInformation() called but unable to find GetMetadata location. Failed login?\n");
}
$optional_params['Type'] = 'METADATA-SYSTEM';
$optional_params['ID'] = '*';
$optional_params['Format'] = 'STANDARD-XML';
//request server information
$result = $this->RETSRequest($this->capability_url['GetMetadata'], $optional_params );
if (!$result) {
return false;
}
list($headers, $body) = $result;
$xml = $this->ParseXMLResponse($body);
注意:主要需要注意的是,
$optional_params['ID'] = '*';
应该是'*'而不是'0'
如果有人仍然无法使用 PhRETS v2.x.x 从 CREA DDF 数据提要检索 STANDARD-XML 数据,我创建了一个分支到 ./src/Parsers/Search/OneX.php文件。您可以在文件末尾添加以下受保护的方法:
protected function parseDDFStandardXMLData(&$xml)
{
// we can only work with an array
$property_details = json_decode(json_encode($xml), true);
$retn = array();
if(! empty($property_details['RETS-RESPONSE']['PropertyDetails'])) {
foreach($property_details['RETS-RESPONSE']['PropertyDetails'] as $property_array) {
$retn[] = $this->parseArrayElements(null, $property_array);
}
}
return $retn;
}
protected function parseArrayElements($parent_key, $element)
{
// three possible $element types
// 1. scalar value
// 2. sub-array
// 3. SimpleXMLElement Object
$retn = array();
if(is_object($element)) {
$element = json_decode(json_encode($element), true);
}
if(is_array($element)) {
foreach($element as $node_key => $node) {
$key = $node_key;
if(! empty($parent_key)) {
$key = $parent_key . '|' . $key;
}
if(is_array($node) || is_object($node)) {
$nodes = $this->parseArrayElements($key, $node);
if(!empty($nodes)) {
foreach($nodes as $k => $n) {
$retn[$k] = $n;
}
}
}else{
$retn[$key] = $node;
}
}
}else{
$retn[$parent_key] = $element;
}
return $retn;
}
protected function parseRecordFromArray(&$array, Results $rs)
{
$r = new Record;
foreach($rs->getHeaders() as $key => $name) {
$r->set($name, $array[$name]);
}
return $r;
}
然后将 parseRecords() 方法替换为:
protected function parseRecords(Session $rets, &$xml, $parameters, Results $rs)
{
if (isset($xml->DATA)) {
foreach ($xml->DATA as $line) {
$rs->addRecord($this->parseRecordFromLine($rets, $xml, $parameters, $line, $rs));
}
}elseif (isset($xml->{"RETS-RESPONSE"}->PropertyDetails)) {
$data = $this->parseDDFStandardXMLData($xml);
if(! empty($data)) {
$fields_saved = false;
foreach ($data as $line) {
if(!$fields_saved) {
$rs->setHeaders(array_keys($line));
}
$rs->addRecord($this->parseRecordFromArray($line, $rs));
}
}
}
}
后一种方法中的 }elseif (isset($xml->{"RETS-RESPONSE"}->PropertyDetails)) {
行可以识别 STANDARD-XML RETS-RESPONSE 节点并解析数据。
希望这对您有所帮助,
干杯!
是否有使用 PHRETS 从 RETS 下载 STANDARD-XML 元数据的解决方案?
目前我能够使用 PHRETS 函数 GetMetadataTable 将每个 class 元数据提取为数组,并合并并转换为 XML 格式。
但最近我发现了单个 STANDARD-XML 元数据(整个资源和 classes)和单个 class 元数据的差异。同样使用元数据查看器服务 RETSMD.com(基于 PHRETS),从 STANDARD-XML 元数据获取的 class 名称不同,无法查看详细信息。
注意:我通过使用凭据直接登录浏览器获得了 STANDARD-XML 元数据,如下所示 http://rets.login.url/GetMetadata?Type=METADATA-TABLE&Format=STANDARD-XML&ID=0
有人遇到过同样的情况吗?有没有使用PHP的解决方案?
提前致谢!
我通过修改 PHRETS 库得到了解决方案。 使用以下代码添加了一个新功能,
if (empty($this->capability_url['GetMetadata'])) {
die("GetServerInformation() called but unable to find GetMetadata location. Failed login?\n");
}
$optional_params['Type'] = 'METADATA-SYSTEM';
$optional_params['ID'] = '*';
$optional_params['Format'] = 'STANDARD-XML';
//request server information
$result = $this->RETSRequest($this->capability_url['GetMetadata'], $optional_params );
if (!$result) {
return false;
}
list($headers, $body) = $result;
$xml = $this->ParseXMLResponse($body);
注意:主要需要注意的是,
$optional_params['ID'] = '*';
应该是'*'而不是'0'
如果有人仍然无法使用 PhRETS v2.x.x 从 CREA DDF 数据提要检索 STANDARD-XML 数据,我创建了一个分支到 ./src/Parsers/Search/OneX.php文件。您可以在文件末尾添加以下受保护的方法:
protected function parseDDFStandardXMLData(&$xml)
{
// we can only work with an array
$property_details = json_decode(json_encode($xml), true);
$retn = array();
if(! empty($property_details['RETS-RESPONSE']['PropertyDetails'])) {
foreach($property_details['RETS-RESPONSE']['PropertyDetails'] as $property_array) {
$retn[] = $this->parseArrayElements(null, $property_array);
}
}
return $retn;
}
protected function parseArrayElements($parent_key, $element)
{
// three possible $element types
// 1. scalar value
// 2. sub-array
// 3. SimpleXMLElement Object
$retn = array();
if(is_object($element)) {
$element = json_decode(json_encode($element), true);
}
if(is_array($element)) {
foreach($element as $node_key => $node) {
$key = $node_key;
if(! empty($parent_key)) {
$key = $parent_key . '|' . $key;
}
if(is_array($node) || is_object($node)) {
$nodes = $this->parseArrayElements($key, $node);
if(!empty($nodes)) {
foreach($nodes as $k => $n) {
$retn[$k] = $n;
}
}
}else{
$retn[$key] = $node;
}
}
}else{
$retn[$parent_key] = $element;
}
return $retn;
}
protected function parseRecordFromArray(&$array, Results $rs)
{
$r = new Record;
foreach($rs->getHeaders() as $key => $name) {
$r->set($name, $array[$name]);
}
return $r;
}
然后将 parseRecords() 方法替换为:
protected function parseRecords(Session $rets, &$xml, $parameters, Results $rs)
{
if (isset($xml->DATA)) {
foreach ($xml->DATA as $line) {
$rs->addRecord($this->parseRecordFromLine($rets, $xml, $parameters, $line, $rs));
}
}elseif (isset($xml->{"RETS-RESPONSE"}->PropertyDetails)) {
$data = $this->parseDDFStandardXMLData($xml);
if(! empty($data)) {
$fields_saved = false;
foreach ($data as $line) {
if(!$fields_saved) {
$rs->setHeaders(array_keys($line));
}
$rs->addRecord($this->parseRecordFromArray($line, $rs));
}
}
}
}
后一种方法中的 }elseif (isset($xml->{"RETS-RESPONSE"}->PropertyDetails)) {
行可以识别 STANDARD-XML RETS-RESPONSE 节点并解析数据。
希望这对您有所帮助,
干杯!