Как получить данные из фразы в удаленном XML в php? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу получить данные из XML-файла на удаленном сайте с определенного узла. Но я получаю следующую ошибку

Предупреждение: simplexml_load_file (): в строке php

в предупреждении 2: Загрузка данных файла. В результате я хочу получить GRate .

Примечание. Я включил модуль SimpleXML при установке php.

<code>
<?php
  $url = "http://api.srinivasajewellery.com/getrate/getrate";
  $xml = simplexml_load_file($url) or die("not open");

  ?><pre><?php //print_r($xml); ?>
GRate как $ GRate) {printf ('$ GRate');}?>

Я ожидал получить «3640,00» на своем выходе, но ошибка выглядит следующим образом

Предупреждение: simplexml_load_file (): http://api.srinivasajewellery.com/getrate/getrate:1: Ошибка синтаксического анализатора: Стартожидаемый тег, <<не найден в H: \ root \ home \ srinivasauser-001 \ www \ goldrate \ wp-content \ themes \ twentynineteen \ footer.php в строке 24 </p>

Предупреждение: simplexml_load_file ():{"GRate": "3640.00", "SRate": "49.00", "PRate": "0.00"} в H: \ root \ home \ srinivasauser-001 \ www \ goldrate \ wp-content \ themes \ twentynineteen \ footer.php в строке 24

Предупреждение: simplexml_load_file (): ^ в H: \ root \ home \ srinivasauser-001 \ www \ goldrate \ wp-content \ themes \ twentynineteen \ footer.php в строке 24 не открыт.

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Когда в PHP запрашивается URL "http://api.srinivasajewellery.com/getrate/getrate" с настройками по умолчанию, он возвращает данные в формате JSON. Какой может будет еще проще проанализировать в этом случае:

<?php

$url = "http://api.srinivasajewellery.com/getrate/getrate";
$json = json_decode(file_get_contents($url));

echo '$GRate: ' . $json->GRate, "\n";

Вывод:

$GRate: 3670.00

Это можно легко проверить, выбрав URL-адрес и дословно выведя его:

$buffer = file_get_contents($url);
echo $buffer, "\n";
{"GRate":"3670.00","SRate":"50.00","PRate":"0.00"}

Как было продемонстрировано Виджаем Дохар , можно сказать этому серверу, что XML предпочтительнее. Проверить, работает ли это, возможно и так:

stream_context_get_default(['http' => ['header' => 'Accept: application/xml']]);
$buffer = file_get_contents($url);
echo $buffer, "\n";

Вывод не так уж и украшен (я думаю, что если данных больше, JSON будет не так легко прочитать). как это также увеличилось бы):

<GetRateController.Rate xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Savings.Controllers"><GRate>3670.00</GRate><PRate>0.00</PRate><SRate>50.00</SRate></GetRateController.Rate>

Это может быть похоже на открытие URL в браузере. Это связано с тем, что браузер также отправляет заголовок запроса Accept, который также содержит XML:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

Поскольку браузер обычно также принимает XML (хотя предпочитает HTML-файл).

Таким образом, в конечном итоге это зависит от того, что вы предпочитаете. Либо JSON, который является менее многословным по сравнению с XML (см. Самый первый пример кода выше), либо, если вы хотите использовать XML с SimpleXML:

<?php

$url = "http://api.srinivasajewellery.com/getrate/getrate";
stream_context_get_default(['http' => ['header' => 'Accept: application/xml']]);
$xml = simplexml_load_file($url) or die("not open");

echo '$GRate: ' . $xml->GRate, "\n";

Вывод:

$GRate: 3670.00
0 голосов
/ 15 октября 2019

Попробуйте следующий код,

<?php
  $url = "http://api.srinivasajewellery.com/getrate/getrate";
  $context  = stream_context_create(array('http' => array('header' => 'Accept: application/xml')));

  $xml = file_get_contents($url, false, $context);

  $xml = simplexml_load_string($xml) or die("not open");

  foreach($xml->GRate as $GRate){
    echo '$GRate: '.$GRate;
  }
?>
...