Загрузка поиска и извлечения по URL (SRU) в php с помощью simplexml_load_string возвращает пустой объект

Terje Nesthus спросил: 13 июня 2018 в 12:01 в: php

Я пытаюсь загрузить результат поиска из библиотеки api с помощью поиска и получения по URL (SRU) по адресу: https ://data.norge.no/data/bibsys/bibsys-bibliotekbase-bibliografiske-data-sru

Если вы видите ссылки с результатами поиска, это выглядит так же, как XML, но когда я пытаюсь как я перед этим в xml, используя следующий код, он просто возвращает пустой объект,

SimpleXMLElement {#546}

, что происходит здесь?

Моя функция php в моем проекте laravel:

public function bokId($bokid) {
    $apiUrl = "http://sru.bibsys.no/search/biblio?version=1.2&operation=searchRetrieve&startRecord=1&maximumRecords=10&query=ibsen&recordSchema=marcxchange";
    $filename = "bok.xml";
    $xmlfile = file_get_contents($apiUrl);
    file_put_contents($filename, $xmlfile); // xml file is saved.
    $fileXml = simplexml_load_string($xmlfile);
    dd($fileXml);
}

Если я сделаю:

 dd($xmlfile);

, он будет звучать следующим образом:

Я очень смущен, что я не могу получить объект для работы. Код, который я представил, работал хорошо.

1 ответ

Есть решение
Nigel Ren ответил: 18 июня 2018 в 08:03

Возможно, данные, которые вы предоставили, изменили формат, но данные все еще существуют, и вы все еще можете использовать его. Основная проблема с использованием чего-то вроде dd() заключается в том, что он не очень хорошо работает с SimpleXMLElements, он имеет тенденцию иметь собственное представление о том, что вы хотите увидеть о том, какие данные есть.

В этом случае пространства имен являются обычной проблемой. Но если вы посмотрите на следующий код, вы можете быстро просмотреть данные из определенного пространства имен, после чего вы сможете легко получить доступ, как обычно. В этом коде я использую ->children("srw", true), чтобы сказать выборки всех дочерних элементов, которые находятся в пространстве имен srw (второй аргумент указывает, что это префикс, а не URL) ...

$apiUrl = "http://sru.bibsys.no/search/biblio?version=1.2&operation=searchRetrieve&startRecord=1&maximumRecords=10&query=ibsen&recordSchema=marcxchange";
$filename = "bok.xml";
$xmlfile = file_get_contents($apiUrl);
file_put_contents($filename, $xmlfile); // xml file is saved.
$fileXml = simplexml_load_string($xmlfile);foreach ( $fileXml->children("srw", true)->records->record as $record)  {
    echo "recordIdentifier=".$record->recordIdentifier.PHP_EOL;
}

Это выводит ...

recordIdentifier=792012771
recordIdentifier=941956423
recordIdentifier=941956466
recordIdentifier=950546232
recordIdentifier=802109055
recordIdentifier=910941041
recordIdentifier=940589451
recordIdentifier=951721941
recordIdentifier=080703852
recordIdentifier=011800283

Поскольку я не уверен, какие данные вы хотите получить в качестве названия, я просто хотел показать идею о том, как для получения данных, когда у вас есть список возможностей. В этом примере я использую XPath для поиска в каждом элементе <srw:record> и найдите элемент <marc:datafield tag="100"...> и в этом элементе <marc:subfield code="a">. Это делается с помощью //marc:datafield[@tag='100']/marc:subfield[@code='a']. Возможно, вам нужно будет отрегулировать бит @tag= в поле данных после и @code=, чтобы указать на подполе после него.

$fileXml = simplexml_load_string($xmlfile);
$fileXml->registerXPathNamespace("marc","info:lc/xmlns/marcxchange-v1");foreach ( $fileXml->children("srw", true)->records->record as $record)  {
    echo "recordIdentifier=".$record->recordIdentifier.PHP_EOL;    $data = $record->xpath("//marc:datafield[@tag='100']/marc:subfield[@code='a']");
    $subData=$data[0]->children("marc", true);
    echo "Data=".(string)$data[0].PHP_EOL;
}
Terje Nesthus ответил: 14 июня 2018 в 01:50
Большое спасибо за рабочее решение и объяснение!
Terje Nesthus ответил: 18 июня 2018 в 06:24
Найджел, мне интересно, можете ли вы также помочь мне получить данные из фактических записей. Как пример того, как получить имя строковой книги, например, первую запись. Я так много пробовал после вашего сообщения и искал аналогичный код, но я больше не получил. (вещи, которые я пробовал hastebin.com/bumuqimaba.pl). Я чувствую, что им так близко, что я действительно использую этот api, но мне нужна помощь. Был бы очень признателен.
Nigel Ren ответил: 18 июня 2018 в 08:04
Я добавил пример, не совсем уверен, какие поля вы были после, но надеюсь, что это поможет.
Terje Nesthus ответил: 18 июня 2018 в 10:02
Это действительно полезно, большое вам спасибо, высоко ценю.

Дополнительное видео по вопросу: Загрузка поиска и извлечения по URL (SRU) в php с помощью simplexml_load_string возвращает пустой объект

How to parse an XML data using PHP

PHP Simple XML Demo

How to iterate or loop over an XML object using PHP