如何从 php 中的远程 XML 中的短语获取数据?

How to get data from an phrase in remote XML in php?

我想从特定节点的远程站点上的 XML 文件中获取数据。但是我收到以下错误

警告:simplexml_load_file(): 在 php 行

关于警告 2:它正在加载文件数据。我想要的结果是获得 GRate.

注意:我在 php 安装中启用了简单 XML 模块。


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

  ?><pre><?php //print_r($xml); ?></pre><?php

  foreach($xml->GRate as $GRate){
    printf('$GRate');
  }
?>

我原以为我的输出结果是“3640.00”,但错误如下

警告:simplexml_load_file():http://api.srinivasajewellery.com/getrate/getrate:1:解析器错误:需要开始标记,在第 24 行的 H:\root\home\srinivasauser-001\www\goldrate\wp-content\themes\twentynineteen\footer.php 中找不到“<”

警告: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():第 24 行 H:\root\home\srinivasauser-001\www\goldrate\wp-content\themes\twentynineteen\footer.php 中的 ^ 未打开。

试试下面的代码,

<?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;
  }
?>

当使用默认设置从 PHP 请求 URL “http://api.srinivasajewellery.com/getrate/getrate” 时,它将 return 数据作为 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"}

demonstrated by Vijay Dohare 一样,可以告诉服务器 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 请求 header 并且它还包含 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 which is less verbose compared to 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