Здравствуйте. Есть определенный $url, выдает данные в формате xml. Хочу через simplexml_load_file получить xml объект по запросу на этот $url, но ничего не получается, ни ошибок, ничего... Скрипт ниже: PHP: setlocale(LC_ALL, 'ru_RU.UTF-8'); header('Content-type: text/xml;charset=windows-1251'); //header('Content-Type: application/json;charset=windows-1251'); header('Access-Control-Allow-Origin: *'); error_reporting(E_ERROR); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); $url = 'тут адрес'; '; $options = array( 'http'=>array( 'method'=>"POST", 'header'=>"Accept: application/xml\r\n" . "Authorization: ключ\r\n"), 'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true) ); $context = stream_context_create($options); $file = file_get_contents($url, false, $context); $file = simplexml_load_file($file); print_r($file); Если изменить MIME тип на header('Content-Type: application/json;charset=windows-1251'); file_get_contents получит данные в тегах html. Как получить данные в формате xml?
20 строчка: $file, который вы передаете параметром, не будет являться , по идее, именем файла https://www.php.net/manual/ru/function.simplexml-load-string.php
Спасибо, заменил на simplexml_load_string. Пишет, что документ пуст... This page contains the following errors: error on line 1 at column 1: Document is empty Below is a rendering of the page up to the first error.
var_dump показывает, что $file содержит нужную информацию, но $xml ==false. Ни ошибок, ничего... PHP: header('Content-Type: application/json;charset=windows-1251'); header('Access-Control-Allow-Origin: *'); error_reporting(E_ERROR); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); $url = 'site.ru'; $options = array( 'http'=>array( 'method'=>"POST", 'header'=>"Accept: application/json\r\n" . "Authorization: key\r\n"), 'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true) ); $context = stream_context_create($options); $file = file_get_contents($url, false, $context); // var_dump($file); $xml = simplexml_load_file($file); if ($xml === false) { echo "Failed loading XML: "; foreach(libxml_get_errors() as $error) { echo "<br>", $error->message; } } else { print_r($xml); }
Сохраните содержимое $file в файл. И проверьте его валидатором. Кроме того, вы всё еще используете simplexml_load_file а не *string
PHP: setlocale(LC_ALL, 'ru_RU.UTF-8'); header('Content-Type: application/json;charset=windows-1251'); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); $url = 'https://adress/outtype=xml'; $options = array( 'http'=>array( 'method'=>"POST", 'header'=>"Accept: application/xml\r\n" . "Authorization: secretKey\r\n"), 'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true) ); $context = stream_context_create($options); $file = file_get_contents($url, false, $context); file_put_contents('test.xml', $file); $xml = XMLReader::open('test.xml'); $xml->setParserProperty(XMLReader::VALIDATE, true); var_dump($xml->isValid()); $temp = simplexml_load_file('test.xml'); var_dump($temp); результат: PHP: bool(true) bool(false) Файл test.xml содержит html код
Код (Text): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Windows-1251"> <META name="GENERATOR" content="IBM WebSphere Studio"> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="Expires" CONTENT="-1"> <TITLE>ПВ - Паспорт а </TITLE> <link rel="stylesheet" type="text/css" href="asupv.css"> <style type="text/css"> .notForClient{ }; .obvag{ display: block; }; </style> <SCRIPT language="JavaScript" SRC="asupv.js"></SCRIPT> </HEAD> <BODY style="overflow: visible;" > <!-- <p class="DebugMsg"> remHT = {6={tekVidM=0003, tekKodName=прохождение ДОК, tekKorPr=196, tekKorPrFName= ный участок Москва-Ярославская, tekTimen=08:00:00, tekMestoDorName=ОКТ , tekKor=0020, tekTimek=18:00:00, tekKorT=00:00:00, tekKorPrName=ЛВЧ-3, tekMestoFName= ное Санкт-Петербург Главный, tekKorPrDorName=МСК , tekTable=remont, tekDPR=, tekMestoName=ВЧД-08, tekKod=0013, tekKorFName=, tekDatan=2009-10-27, tekProbeg=0, tekMesto=145, tekKorD=2021-08-17, tekKorName=, tekDatak=2009-10-31, tekInv=31124, tekModern=, tekKodFName=прохождение ДОК}, 5={tekVidM=0003, tekKodName=ДР, tekKorPr=160, tekKorPrFName= ный участок Санкт-Петербург- ий, tekTimen=12:00:00, tekMestoDorName=ОКТ , tekKor=, tekTimek=12:00:00, tekKorT=00:00:00, tekKorPrName=ЛВЧ-СПБ_МОСК, tekMestoFName= ое ное СПб- ий, tekKorPrDorName=ОКТ , tekTable=remont, tekDPR=, tekMestoName=ЛВЧД-8, tekKod=0005, tekKorFName=, tekDatan=2014-05-02, tekProbeg=666082, tekMesto=145, tekKorD=2021-08-17, tekKorName=, tekDatak=2014-05-02, tekInv=31124, tekModern=, tekKodFName= вской }, 4={tekVidM=0003, tekKodName=КР-1, tekKorPr=144, tekKorPrFName= ое ное Москва, tekTimen=08:00:00, tekMestoDorName=ОКТ , tekKor=, tekTimek=18:00:00, tekKorT=19:48:44, tekKorPrName=ЛВЧД-МОСКВА_ОКТ, tekMestoFName= ое ное Москва, tekKorPrDorName=ОКТ , tekTable=vu36_remont, tekDPR=0009, tekMestoName=ЛВЧД-МОСКВА_ОКТ, tekKod=0002, tekKorFName=, tekDatan=2019-12-20, tekProbeg=870171, tekMesto=144, tekKorD=2020-01-12, tekKorName=, tekDatak=2020-01-11, tekInv=31124, tekModern= , tekKodFName= ьный первого объёма}, 3={tekVidM=0003, tekKodName=ТО-3, tekKorPr=212, tekKorPrFName=ЛВЧД-Киров, tekTimen=08:00:00, tekMestoDorName=ГОР , tekKor=, tekTimek=16:00:00, tekKorT=09:54:36, tekKorPrName=ЛВЧД-КИРОВ, tekMestoFName=ЛВЧД-Киров, tekKorPrDorName=ГОР , tekTable=vu36_remont, tekDPR=0009, tekMestoName=ЛВЧД-КИРОВ, tekKod=0006, tekKorFName=, tekDatan=2021-01-14, tekProbeg=990639, tekMesto=212, tekKorD=2021-01-15, tekKorName=, tekDatak=2021-01-14, tekInv=31124, tekModern= , tekKodFName=техническое обслуживание -3}, 2={tekVidM=0003, tekKodName=ТО-2, tekKorPr=304, tekKorPrFName= ный участок Хабаровск, tekTimen=12:00:00, tekMestoDorName=Д-В , tekKor=, tekTimek=12:00:00, tekKorT=00:00:00, tekKorPrName=ЛВЧ-1, tekMestoFName= ный участок Хабаровск, tekKorPrDorName=Д-В , tekTable=remont, tekDPR=, tekMestoName=ЛВЧ-1, tekKod=0020, tekKorFName=, tekDatan=2021-09-21, tekProbeg=1008932, tekMesto=304, tekKorD=2021-09-22, tekKorName=, tekDatak=2021-09-21, tekInv=31124, tekModern=, tekKodFName=техническое обслуживание - 2}, 1={tekVidM=0003, tekKodName=ТО-1, tekKorPr=196, tekKorPrFName= ный участок Москва-Ярославская, tekTimen=23:00:00, tekMestoDorName=МСК , tekKor=, tekTimek=23:00:00, tekKorT=00:00:00, tekKorPrName=ЛВЧ-3, tekMestoFName= ный участок Москва-Ярославская, tekKorPrDorName=МСК , tekTable=remont, tekDPR=, tekMestoName=ЛВЧ-3, tekKod=0022, tekKorFName=, tekDatan=2021-10-23, tekProbeg=1034757, tekMesto=196, tekKorD=2021-10-23, tekKorName=, tekDatak=2021-10-23, tekInv=31124, tekModern=, tekKodFName=техническое обслуживание перед отправкой в рейс}, 0={tekVidM=0003, tekKodName=ТОР, tekKorPr=281, tekKorPrFName= ный участок Новосибирск- Главный, tekTimen=01:00:00, tekMestoDorName=З-СИБ, tekKor=, tekTimek=03:00:00, tekKorT=09:05:50, tekKorPrName=ЛВЧ-7, tekMestoFName= ое ное Новосибирск, tekKorPrDorName=З-СИБ, tekTable=vu36, tekDPR=0009, tekMestoName=ЛВЧД-7, tekKod=0007, tekKorFName=, tekDatan=2021-12-08, tekProbeg=1069427, tekMesto=2513, tekKorD=2021-12-09, tekKorName=, tekDatak=2021-12-08, tekInv=31124, tekModern= , tekKodFName=текущий отцепочный }, 7={tekVidM=0004, tekKodName=постройка, tekKorPr=160, tekKorPrFName= ный участок Санкт-Петербург- ий, tekTimen=12:00:00, tekMestoDorName=, tekKor=, tekTimek=12:00:00, tekKorT=00:00:00, tekKorPrName=ЛВЧ-СПБ_МОСК, tekMestoFName=АОЗТ МАШ, tekKorPrDorName=ОКТ , tekTable=remont, tekDPR=, tekMestoName= МАШ, tekKod=0001, tekKorFName=, tekDatan=2005-12-28, tekProbeg=0, tekMesto=6, tekKorD=2021-08-17, tekKorName=, tekDatak=2005-12-28, tekInv=31124, tekModern=, tekKodFName=постройка а}}</p>--> <TABLE width="100%"> <TR><TD align="right" width="100%"> Дата: 16.12.2021 15:54:00 </TD></TR> </TABLE> <DIV class = "onMetallDiv" id = "OnMetall" style = "display: none"> Разделан на<BR> металлолом<BR> </DIV> <DIV class="nvDiv" id = "DivNv"> <h1>Электронный паспорт а № 00152280 <a class="NVLink" href='javascript:ShowHistory("nv","00152280")' title ="История" ><IMG alt="История" src="image/view.gif" border="0"></a> <a class="NVLink" href='javascript:showABDVPP();' title="Справка о паспортных данных и эксплуатационных ресурсах а РФ из АБД ВПП" ><IMG alt="Справка о паспортных данных и эксплуатационных ресурсах а РФ из АБД ВПП" src="image/db_rus.png" border="0" width="24" height="24"></a> Вот его часть. Выглядит как исходный код страницы.
Значит вы что-то не то импортируете. Правильно? От PHP-то вы что хотите? Подайте ему корректные данные и всё будет.
Вопрос в том как это сделать. Если перейти по ссылке (простите, но она вырезана из кода) просто через браузер, открывается именно структура xml, все корректно. Если я шлю header('Content-Type: text/xml); (строка 2), получаю ошибку: Код (Text): This page contains the following errors: error on line 2 at column 1: Extra content at the end of the document Below is a rendering of the page up to the first error. Или ту, что выше. Хоть какие-то данные получается вытащить только в виде исходного кода страницы.
Значит что-то не передаете. Куки скорее всего, с авторизацией например. А может сам факт их отсутствия играет роль. Замените file_get_contents() на curl()
PHP: error_reporting(E_ERROR); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); $url = 'https://site.ru/nvag=00152280&datesel=yes&sdate=16.12.2021&ch=15&min=54&stime=15%3A54&outtype=xml '; $url = str_replace(' ', '', $url ); $url = str_replace("\t", '', $url ); $url = str_replace("\n", '', $url ); $url = str_replace("\r", '', $url ); $auth = 'login:Pass!'; $options = array( 'http'=>array( 'method'=>"POST", 'header'=>"Accept: application/xml\r\n" . "Authorization: key\r\n") ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($curl, CURLOPT_USERPWD, $auth); curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/tools/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['DOCUMENT_ROOT'].'/tools/cookie.txt'); curl_setopt($curl, CURLOPT_POSTFIELDS, $options); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); $data = curl_exec($ch); if (curl_errno($ch)) $error_msg = curl_error($ch); curl_close($ch); if (isset($error_msg)) echo "$error_msg"; var_dump($data); Получаю ошибку The requested URL returned error: 400 Bad Request, устал с ней биться Я в очередной раз иссяк, подскажите, куда копать теперь? Сайт, с которого пытаюсь получить xml, требует авторизации и спец ключа. Возможно это важно. Логин\пасс\ключ в наличии, корректны. Через веб браузер нужнаня страница открывается без проблем
@Drunkenmunky , спасибо за помощь. Вопрос решен. Код из первого поста рабочий. Проблема была в знаке \n в адресе ссылки, https://site.ru/assdfa=23424 \n &outtype=xml Скрипт просто не считывал конец ссылки, и не выводил требуемые данные в формате xml.