为什么我的simplexml_load_file不起作用?

时间:2014-12-06 16:16:46

标签: php simplexml

我一直坚持使用simplexml_load_file获取XML内容,不知道为什么它不起作用?它与下面的源有关吗?..

$Url='http://datacenter.biathlonresults.com/modules/sportapi/api/CupResults?CupId=BT1415SWRLCP__SMTS';
$XML=simplexml_load_file($Url);

4 个答案:

答案 0 :(得分:0)

您应该使用:

$Url='http://datacenter.biathlonresults.com/modules/sportapi/api/CupResults?CupId=BT1415SWRLCP__SMTS';
$XML=simplexml_load_file(file_get_contents($Url));

答案 1 :(得分:0)

发现file_get_contents返回JSON所以:

$ X = json_decode(的file_get_contents($ URL));

诀窍......

答案 2 :(得分:0)

因为如果你在浏览器中打开这个链接,那就是xml。如果你试图让我通过PHP它是JSON。 试试这段代码

$Url='http://datacenter.biathlonresults.com/modules/sportapi/api/CupResults?CupId=BT1415SWRLCP__SMTS';

$fileContent =  json_decode(file_get_contents($Url));

答案 3 :(得分:0)

您的代码中存在两个很少(但很常见)的错误,这些错误会阻止您快速找到自己发生的事情(以及如何找到解决方案)。

首先,您没有进行任何错误检查。如果无法打开文件,simplexml_load_file()将返回FALSE

$xml = simplexml_load_file($url);
if (!$xml) {
    // error opening the URL
    return false;
}

这还不是很有用,您现在可以启用PHP错误报告/日志记录来实际查看创建的错误:

  

警告:simplexml_load_file():http://datacenter.biathlonresults.com/modules/sportapi/api/CupResults?CupId = BT1415SWRLCP__SMTS:1:解析器错误:开始预期标记,'<'在[...]

中找不到      

警告:simplexml_load_file():{" AsOf":" 2014-12-22T11:45:50.5976703 + 00:00"," RaceCount":25 "行":[{"秩":" 1""在[...]

     

警告:simplexml_load_file():^ [...]

这已经表明对该URL的HTTP请求不提供XML而是提供JSON(请参阅第二个警告)。

通过告诉服务器在这里接受XML,很容易验证:

stream_context_set_default(['http' => ['header' => "Accept: text/xml"]]);
$xml = simplexml_load_file($url);

whcih现在正常工作,服务器现在提供XML,可以正确解析并创建 SimpleXMLElement

完整的代码示例:

<?php

$url = 'http://datacenter.biathlonresults.com/modules/sportapi/api/CupResults?CupId=BT1415SWRLCP__SMTS';
stream_context_set_default(['http' => ['header' => "Accept: text/xml"]]);
$xml = simplexml_load_file($url);
if (!$xml) {
    // error opening the file
    var_dump(libxml_get_errors());
    return false;
}

$xml->asXML('php://output');

输出:

<?xml version="1.0"?>
<CupResultsResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/sportapi"><AsOf>2014-12-22T11:45:50.5976703+00:00</AsOf><RaceCount>25</RaceCount><Rows><CupResultRow>[...]

此代码示例是the answer of a very similar question的较短版本,涵盖相同的基础:

对于运行ASP.NET的Microsoft-IIS Server,这种行为似乎很常见,很可能是一些REST API组件。