парсинг XML из curl (mobile.de API) не будет работать - PullRequest
0 голосов
/ 03 декабря 2018

там,

Я хотел бы создать домашнюю страницу и автоматически показывать на ней рекламу mobile.de.Для этого есть API от mobile.de: https://services.mobile.de/manual/search-api.html

У меня есть правильные данные доступа, и когда я начинаю вызов через браузер: https://services.mobile.de/search-api/search?customerNumber=503300

я получаю такой результат:

<search:search-result xmlns:seller="http://services.mobile.de/schema/seller" xmlns:ad="http://services.mobile.de/schema/ad" xmlns:search="http://services.mobile.de/schema/search" xmlns:financing="http://services.mobile.de/schema/common/financing-1.0" xmlns:resource="http://services.mobile.de/schema/resource" xmlns:error="http://services.mobile.de/schema/common/error-1.0">
<search:total>4</search:total>
<search:page-size>20</search:page-size>
<search:current-page>1</search:current-page>
<search:max-pages>1</search:max-pages>
<search:ads>
<ad:ad key="266399529" url="https://services.mobile.de/search-api/ad/266399529">
<ad:creation-date value="2018-11-19T07:53:58+01:00"/>
<ad:modification-date value="2018-11-19T07:53:58+01:00"/>
<ad:detail-page url="https://suchen.mobile.de/auto-inserat/porsche-997-gt3-rs-ruf-4-0-einzelst%C3%BCck-allrad-solms/266399529.html?source=api"/>
<ad:vehicle>

Хорошо выглядит для меня!Теперь я хотел бы просмотреть отдельные объявления и есть проблемы.Отдельные объявления сгруппированы по этой строке:

<ad:ad key="266399529" url="https://services.mobile.de/search-api/ad/266399529">

Благодаря моему многолетнему опыту и особенно через Интернет, я пришел к следующему коду:

        error_reporting(E_ALL);
    ini_set('display_errors', true);
    $process = curl_init("https://services.mobile.de/search-api/search?customerNumber=503300"); 
    curl_setopt($process, CURLOPT_HTTPHEADER, array('Content-Type: application/xml')); 
    curl_setopt($process, CURLOPT_HEADER, 0); 
    curl_setopt($process, CURLOPT_USERPWD, "username:password"); 
    curl_setopt($process, CURLOPT_TIMEOUT, 30); 
    curl_setopt($process, CURLOPT_RETURNTRANSFER, TRUE); 
    $return = curl_exec($process); 
    curl_close($process);  
    $xml = simplexml_load_string($return);
    $ns = $xml->children('http://services.mobile.de/schema/ad');
    foreach($ns as $ad) {
        $attributes = $ad->attributes();
        $key = (string) $attributes['key'];

        var_dump($key);
    }  

К сожалению, я получаюточно ничего как ответ, пустая страница без сообщения об ошибке.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В качестве альтернативы вы также можете использовать выражение xpath с префиксом пространства имен:

//search:search-result/search:ads/ad:ad

Например:

$ads = $xml->xpath('//search:search-result/search:ads/ad:ad');
foreach ($ads as $ad) {
    $key = (string)$ad->attributes()->key;
}
0 голосов
/ 04 декабря 2018

Проблема в том, что у вас есть другой элемент между вашим корневым узлом и элементом <ad:ad>.Вам нужно пройти через элемент <search:ads> ...

$ns = $xml->children('http://services.mobile.de/schema/search')->ads
    ->children('http://services.mobile.de/schema/ad');

Чтобы получить доступ к деталям рекламы, вам нужно снова взглянуть на структуру и увидеть, какие элементы вы хотите и в каком пространстве имен они находятся.Таким образом, для текста элемента категории каждого объявления вы можете использовать цикл и ...

$ns = $xml->children('http://services.mobile.de/schema/search')->ads
    ->children('http://services.mobile.de/schema/ad');

foreach($ns as $ad) {
    foreach ( $ad->vehicle as $vehicle )    {
        echo (string)$vehicle->category[0]
            ->children("http://services.mobile.de/schema/resource")
            ->{'local-description'}.PHP_EOL;
    }
}  

Пара вещей с этим заключается в том, что элемент <resource:local-description> находится в другом пространстве имен,вот почему он использует ->children() с этим другим пространством имен.Также, поскольку имя содержит -, вы должны получить к нему доступ, используя ->{'local-description'}, чтобы сделать его действительным именем.

Наконец - поскольку все это вернет элемент, на который оно указывает, вы должны привести его кстрока (используя (string) в начале), чтобы убедиться, что в итоге вы получите только текст из элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...