Как загрузить метаданные STANDARD-XML из RETS с помощью PHRETS

Есть ли решение для загрузки метаданных STANDARD-XML из RETS с использованием PHRETS?

В настоящее время я могу извлекать метаданные каждого класса в виде массива, используя функцию PHRETS GetMetadataTable и комбинируя и конвертируя в формат XML.

Но недавно я обнаружил разницу в отдельных метаданных STANDARD-XML (целых ресурсов и классов) и метаданных отдельных классов. Используя службу просмотра метаданных RETSMD.com(построенную на PHRETS), имя класса, полученное из метаданных STANDARD-XML, отличается и не может просматривать детали.

Примечание. Я получил метаданные STANDARD-XML через прямой вход в браузер с использованием учетных данных, например http://rets.login.url/GetMetadata?Type=METADATA-TABLE&Format=STANDARD-XML&ID=0

Кто-нибудь сталкивался с таким же? Есть ли решение с использованием PHP?

Заранее спасибо!

2 ответа

Решение

Я получил решение, изменив библиотеку 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'

Если кто-то по-прежнему не может получить данные STANDARD-XML из потока данных CREA DDF с помощью PhRETS v2.xx, я создал ответвление для файла ./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 и анализировать данные.

Надеюсь это поможет,

Ваше здоровье!

Другие вопросы по тегам