Я хочу прочитать некоторые данные из ленты 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");
Если вы запустите следующий код, вы увидите, что на самом деле вы получаете 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":"[email protected]","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] => [email protected]
Если вам нужны данные 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
.
Потенциальный дубликат: Загрузка удаленной 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;
}
?>
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! 🙂