За последние 24 часа нас посетил 17441 программист и 1882 робота. Сейчас ищут 1278 программистов ...

file_get_contents и xml данные

Тема в разделе "Прочие вопросы по PHP", создана пользователем filip, 17 дек 2021.

  1. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    Здравствуйте. Есть определенный $url, выдает данные в формате xml. Хочу через simplexml_load_file получить xml объект по запросу на этот $url, но ничего не получается, ни ошибок, ничего...
    Скрипт ниже:
    PHP:
    1. setlocale(LC_ALL, 'ru_RU.UTF-8');
    2.  
    3. header('Content-type: text/xml;charset=windows-1251');
    4. //header('Content-Type: application/json;charset=windows-1251');
    5. header('Access-Control-Allow-Origin: *');
    6. error_reporting(E_ERROR);
    7. ini_set('display_errors', TRUE);
    8. ini_set('display_startup_errors', TRUE);
    9.     $url = 'тут адрес';
    10. ';
    11.    $options = array(
    12.      'http'=>array(
    13.        'method'=>"POST",
    14.        'header'=>"Accept: application/xml\r\n" .
    15.                  "Authorization: ключ\r\n"),
    16.      'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true)
    17.    );
    18.    $context = stream_context_create($options);
    19.    $file = file_get_contents($url, false, $context);
    20.    $file = simplexml_load_file($file);
    21. print_r($file);
    Если изменить MIME тип на header('Content-Type: application/json;charset=windows-1251'); file_get_contents получит данные в тегах html.
    Как получить данные в формате xml?
     
  2. roboformation

    roboformation Активный пользователь

    С нами с:
    30 авг 2020
    Сообщения:
    162
    Симпатии:
    40
  3. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    Спасибо, заменил на 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.
     
  4. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    var_dump показывает, что $file содержит нужную информацию, но $xml ==false. Ни ошибок, ничего...
    PHP:
    1.     header('Content-Type: application/json;charset=windows-1251');
    2.     header('Access-Control-Allow-Origin: *');
    3.     error_reporting(E_ERROR);
    4.     ini_set('display_errors', TRUE);
    5.     ini_set('display_startup_errors', TRUE);
    6.     $url = 'site.ru';
    7.     $options = array(
    8.       'http'=>array(
    9.         'method'=>"POST",
    10.         'header'=>"Accept: application/json\r\n" .
    11.                   "Authorization: key\r\n"),
    12.       'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true)
    13.     );
    14.  
    15.     $context = stream_context_create($options);
    16.     $file = file_get_contents($url, false, $context);
    17.    // var_dump($file);
    18.     $xml = simplexml_load_file($file);
    19.    if ($xml === false) {
    20.     echo "Failed loading XML: ";
    21.     foreach(libxml_get_errors() as $error) {
    22.         echo "<br>", $error->message;
    23.     }
    24. } else {
    25.     print_r($xml);
    26. }
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    Сохраните содержимое $file в файл.
    И проверьте его валидатором.
    Кроме того, вы всё еще используете simplexml_load_file а не *string
     
  6. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    PHP:
    1.     setlocale(LC_ALL, 'ru_RU.UTF-8');
    2.     header('Content-Type: application/json;charset=windows-1251');
    3.     ini_set('display_errors', TRUE);
    4.     ini_set('display_startup_errors', TRUE);
    5.     $url = 'https://adress/outtype=xml';
    6.     $options = array(
    7.       'http'=>array(
    8.         'method'=>"POST",
    9.         'header'=>"Accept: application/xml\r\n" .
    10.                   "Authorization: secretKey\r\n"),
    11.       'ssl' => array('verify_peer'=>false, 'allow_self_signed' => true)
    12.     );
    13.  
    14.     $context = stream_context_create($options);
    15.     $file = file_get_contents($url, false, $context);
    16.     file_put_contents('test.xml', $file);
    17.     $xml = XMLReader::open('test.xml');
    18.     $xml->setParserProperty(XMLReader::VALIDATE, true);
    19.     var_dump($xml->isValid());
    20.     $temp = simplexml_load_file('test.xml');
    21.     var_dump($temp);
    результат:
    PHP:
    1. bool(true)
    2. bool(false)
    Файл test.xml содержит html код
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    ?
     
  8. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    Код (Text):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    2. <HTML>
    3. <HEAD>      
    4.  
    5.  
    6.  
    7.  
    8. <META http-equiv="Content-Type" content="text/html; charset=Windows-1251">
    9. <META name="GENERATOR" content="IBM WebSphere Studio">
    10. <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    11. <META HTTP-EQUIV="Expires" CONTENT="-1">
    12. <TITLE>ПВ - Паспорт  а </TITLE>
    13. <link rel="stylesheet" type="text/css" href="asupv.css">
    14. <style type="text/css">
    15. .notForClient{
    16. };
    17.  
    18. .obvag{
    19.     display: block;
    20. };
    21. </style>
    22.  
    23. <SCRIPT language="JavaScript" SRC="asupv.js"></SCRIPT>
    24.  
    25. </HEAD>
    26. <BODY style="overflow: visible;" >
    27. <!-- <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>-->
    28. <TABLE width="100%">
    29. <TR><TD align="right" width="100%">
    30. Дата: 16.12.2021&nbsp; 15:54:00
    31. </TD></TR>
    32. </TABLE>
    33.  
    34. <DIV class = "onMetallDiv" id = "OnMetall" style = "display: none">
    35. Разделан на<BR>
    36. металлолом<BR>
    37.  
    38. </DIV>
    39.  
    40. <DIV class="nvDiv" id = "DivNv">
    41. <h1>Электронный паспорт  а №&nbsp;00152280&nbsp;<a
    42.     class="NVLink" href='javascript:ShowHistory("nv","00152280")' title ="История"
    43.     ><IMG alt="История" src="image/view.gif" border="0"></a>
    44.    
    45.     <a class="NVLink" href='javascript:showABDVPP();' title="Справка о паспортных данных и эксплуатационных ресурсах  а РФ из АБД ВПП"
    46.     ><IMG alt="Справка о паспортных данных и эксплуатационных ресурсах  а РФ из АБД ВПП" src="image/db_rus.png" border="0" width="24" height="24"></a>
    Вот его часть. Выглядит как исходный код страницы.
     
  9. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    Значит вы что-то не то импортируете. Правильно?
    От PHP-то вы что хотите?
    Подайте ему корректные данные и всё будет.
     
  10. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    Вопрос в том как это сделать.
    Если перейти по ссылке (простите, но она вырезана из кода) просто через браузер, открывается именно структура xml, все корректно.
    Если я шлю header('Content-Type: text/xml); (строка 2), получаю ошибку:
    Код (Text):
    1. This page contains the following errors:
    2. error on line 2 at column 1: Extra content at the end of the document
    3. Below is a rendering of the page up to the first error.
    Или ту, что выше.
    Хоть какие-то данные получается вытащить только в виде исходного кода страницы.
     
  11. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    Значит что-то не передаете. Куки скорее всего, с авторизацией например. А может сам факт их отсутствия играет роль.
    Замените file_get_contents() на curl()
     
    filip нравится это.
  12. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    PHP:
    1.     error_reporting(E_ERROR);
    2.     ini_set('display_errors', TRUE);
    3.     ini_set('display_startup_errors', TRUE);
    4.     $url = 'https://site.ru/nvag=00152280&datesel=yes&sdate=16.12.2021&ch=15&min=54&stime=15%3A54&outtype=xml
    5. ';
    6.     $url  = str_replace(' ', '', $url );
    7.     $url = str_replace("\t", '', $url );
    8.     $url = str_replace("\n", '', $url );
    9.     $url = str_replace("\r", '', $url );
    10.  
    11.     $auth = 'login:Pass!';
    12.     $options = array(
    13.       'http'=>array(
    14.         'method'=>"POST",
    15.         'header'=>"Accept: application/xml\r\n" .
    16.                   "Authorization: key\r\n")
    17.     );
    18.  
    19.         $ch = curl_init();
    20.         curl_setopt($ch, CURLOPT_HEADER, 0);
    21.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    22.         curl_setopt($ch, CURLOPT_URL, $url);
    23.         curl_setopt($ch, CURLOPT_POST, 1);
    24.         curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    25.         curl_setopt($curl, CURLOPT_USERPWD, $auth);
    26.         curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER['DOCUMENT_ROOT'].'/tools/cookie.txt');
    27.         curl_setopt($ch, CURLOPT_COOKIE, $_SERVER['DOCUMENT_ROOT'].'/tools/cookie.txt');
    28.         curl_setopt($curl, CURLOPT_POSTFIELDS, $options);
    29.         curl_setopt($ch, CURLOPT_FAILONERROR, true);
    30.         curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    31.         curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    32.         $data = curl_exec($ch);
    33.         if (curl_errno($ch)) $error_msg = curl_error($ch);
    34.         curl_close($ch);
    35.  
    36.         if (isset($error_msg)) echo "$error_msg";
    37.  
    38.         var_dump($data);
    Получаю ошибку The requested URL returned error: 400 Bad Request, устал с ней биться
    Я в очередной раз иссяк, подскажите, куда копать теперь?

    Сайт, с которого пытаюсь получить xml, требует авторизации и спец ключа. Возможно это важно. Логин\пасс\ключ в наличии, корректны. Через веб браузер нужнаня страница открывается без проблем
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.482
    Симпатии:
    281
    CURLOPT_COOKIE
     
    filip нравится это.
  14. filip

    filip Активный пользователь

    С нами с:
    13 окт 2018
    Сообщения:
    18
    Симпатии:
    0
    @Drunkenmunky , спасибо за помощь. Вопрос решен. Код из первого поста рабочий. Проблема была в знаке \n в адресе ссылки,

    https://site.ru/assdfa=23424 \n &outtype=xml
    Скрипт просто не считывал конец ссылки, и не выводил требуемые данные в формате xml.