Чтение XML из URL с переполнением стека

Я хочу прочитать некоторые данные из ленты XML и показать их на веб-странице с помощью php. Это URL фида:
http://api.autoit.dk/car/GetCarsExtended/391B093F-BB4A-45AA-BEFF-7B33842401EA

Мне сказали, что служба может возвращать как JSON, так и XML, в зависимости от того, что клиент принимает в типе содержимого заголовка. Я пытался перейти с XML, но я получаю некоторые ошибки:

Warning: simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found in /home/www/flexto.dk/test.php on line 3

Warning: simplexml_load_string(): [{"ComId":4712,"Husnr":10,"Navn":"Flexto A/S","By":"Støvring","Postnr":9530,"Ad in /home/www/flexto.dk/test.php on line 3

Warning: simplexml_load_string(): ^ in /home/www/flexto.dk/test.php on line 3
Error: Cannot create object

Смотрите мой онлайн тестовый скрипт.

Это должно быть довольно просто, но мне не повезло с этим. Кто-нибудь поможет мне разобраться?
Мой документ test.php выглядит так просто:

$xml = simplexml_load_string( file_get_contents( 'http://api.autoit.dk/car/GetCarsExtended/391B093F-BB4A-45AA-BEFF-7B33842401EA' ) )
or die("Error: Cannot create object");

0

Решение

Если вы запустите следующий код, вы увидите, что на самом деле вы получаете JSON в качестве ответа:

$resp = file_get_contents( 'http://api.autoit.dk/car/GetCarsExtended/391B093F-BB4A-45AA-BEFF-7B33842401EA' );
echo $resp;

Выход:

[{"ComId":4712,"Husnr":10,"Navn":"Flexto A/S","By":"Støvring","Postnr":9530,"Adresse":"Juelstrupparken","Email":"info@flexto.dk","Telefon":"96365225","KoeretoejId":641321,"Abs":true,"Accelerationsevne0Til100Kmt":null,"AirbagsAntal":6,"Beskrivelse":"- og meget mere.\nDette er et flexleasingtilbud, udbetaling 45.000,- depot 16.000,- leasingydelse 5.700,- alt excl. moms. Restværdi efter 3 år 121.000 excl. afgift.","BreddeMm":1841,

(так далее.)

SimpleXML не может конвертировать JSON в объект, поэтому он явно выдает ошибку.

Если вы хотите использовать данные JSON вместо XML, вы можете просто декодировать JSON:

$data = json_decode($resp, true); // or json_decode($resp) for objects rather than arrays

Часть $data:

(
[0] => Array
(
[ComId] => 4712
[Husnr] => 10
[Navn] => Flexto A/S
[By] => Støvring
[Postnr] => 9530
[Adresse] => Juelstrupparken
[Email] => info@flexto.dk

Если вам нужны данные XML, вам нужно установить соответствующие заголовки при вызове file_get_contents:

$opts = array(
'http' => array(
'header' => "Accept: application/xml")
);

$context = stream_context_create($opts);

$response = file_get_contents( 'http://api.autoit.dk/car/GetCarsExtended/391B093F-BB4A-45AA-BEFF-7B33842401EA', NULL, $context );

Вывод сейчас:

<ArrayOfDealerCarExtended xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/AutoITApis.Controllers"><DealerCarExtended><Abs>true</Abs><Accelerationsevne0Til100Kmt i:nil="true" />

(так далее.)

Увидеть stream_context_create для получения дополнительной информации о том, как настроить заголовки для file_get_contents.

2

Другие решения

Потенциальный дубликат: Загрузка удаленной XML-страницы с помощью file_get_contents ()

Я бы использовал cURL для чего-то подобного.

Вот немного измененный пример из http://php.net/manual/en/curl.examples-basic.php :

<?php

$ch = curl_init();

$options = array(CURLOPT_URL => 'http://www.example.com/',
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => 'Content-type: application/xml'
);

curl_setopt_array($ch, $options);

$data = curl_exec($ch);
curl_close($ch);

if($data) {
$xml = new SimpleXMLElement($data);

echo $xml;
}
?>
1

Curl может быть лучшим вариантом, но вы также можете установить соответствующие заголовки в file_get_contents:

$options = array(
'http' => array(
'method' => "GET",
'header' => "Accept: application/xml\r\n")
);
$context = stream_context_create($options);
$url = 'http://api.autoit.dk/car/GetCarsExtended/391B093F-BB4A-45AA-BEFF-7B33842401EA';
$xml = simplexml_load_string(file_get_contents($url, false, $context)) or die("Error: Cannot create object");

Конечно, вы можете просто использовать JSON! 🙂

0