【问题标题】:PHP How to hit a url and download its xmlPHP如何点击一个url并下载它的xml
【发布时间】:2011-08-26 23:27:00
【问题描述】:

我正在尝试发送此查询:

http://api.geonames.org/search?featureCode=PRK&maxRows=10&username=demo&country=US&style=full&adminCode1=AK

到一个网络服务并下拉并解析那里的一堆字段,即这些:

// 1) totalResultsCount
// 2) name
// 3) lat
// 4) lng
// 5) countryCode
// 6) countryName
// 7) adminName1 - gives full state name
// 8) adminName2 - owner of the park.

我正在这样做:

$query_string = "http://api.geonames.org/search?featureCode=PRK&maxRows=10&username=demo&country=US&style=full&adminCode1=AK";

有人可以提供正确的代码来遍历结果并获取值吗?

【问题讨论】:

  • 你能发布一个你得到的“奇怪”结果的例子吗?
  • 但是那个 URL 返回的是 XML,而不是 JSON!
  • 更新了我的问题。对 JSON/XML 的事情感到抱歉。结果是 XML。

标签: php xml json


【解决方案1】:

首先,看起来该 Web 服务返回的是 XML 而不是 JSON。您可以使用SimpleXML 解析出来。

其次,您可能想查看curl

一个例子:

$ch = curl_init("http://api.geonames.org/search?featureCode=PRK&maxRows=10&username=demo&country=US&style=full&adminCode1=AK");

curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$content = curl_exec($ch); 

curl_close($ch);

【讨论】:

  • 如果 OP 想要解析它,根本不需要 cURL,因为 SimpleXml 可以加载远程 URI。
  • 好电话。值得注意的是,他最初的问题完全不同(关于 JSON)。我最初的观点是关于他的具体情况的旁注。
【解决方案2】:

fopen 会给你一个资源,而不是文件。由于您正在执行 json 解码,因此您只想将整个内容作为字符串。最简单的方法是 file_get_contents。

$query = 'http://api.geonames.org/search?featureCode=PRK&maxRows=10&username=demo&country=US&style=full&adminCode1=AK';
$response = file_get_contents($query);
// You really should do error handling on the response here.
$decoded = json_decode($response, true);
echo '<p>Decoded: '.$decoded['lat'].'</p>';

【讨论】:

  • 虽然...看起来您的 API 的响应数据正在返回 XML...所以上面的代码不会按原样工作。
  • 是的,它实际上是 XML。我疏忽了。
【解决方案3】:

由于响应是XML,所以可以使用SimpleXML

$url = "http://api.geonames.org/search?featureCode=PRK&maxRows=10&username=demo&country=US&style=full&adminCode1=AK";
$xml = new SimpleXMLElement($url, null, true);

echo "totalResultsCount: " . $xml->totalResultsCount . "<br />";

foreach($xml->geoname as $geoname) {
    echo $geoname->toponymName . "<br />";
    echo $geoname->lat . "<br />";
    echo $geoname->countryCode . "<br />";
    echo $geoname->countryName . "<br />";
    echo $geoname->adminName1 . "<br />";
    echo $geoname->adminName2 . "<br />";
}

这将显示如下结果:

totalResultsCount: 225
Glacier Bay National Park and Preserve
58.50056
US
United States
Alaska
US.AK.232

...

【讨论】:

  • SimpleXml 可以加载 URI。你不需要file_get_contents
  • 我忽略了这一点。相应更新。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 2013-12-23
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 2017-12-12
相关资源
最近更新 更多