SimpleXML - I/O 警告:无法加载外部实体

问题描述 投票:0回答:5

我正在尝试创建一个小型应用程序,它可以简单地读取 RSS 提要,然后在页面上布局信息。

我发现的所有说明都使这看起来很简单,但由于某种原因它不起作用。我有以下内容

include_once(ABSPATH.WPINC.'/rss.php');
$feed = file_get_contents('http://feeds.bbci.co.uk/sport/0/football/rss.xml?edition=int');
$items = simplexml_load_file($feed);

就是这样,然后它在第三行中断并出现以下错误

Error: [2] simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "<?xml version="1.0" encoding="UTF-8"?> <?xm
The rest of the XML file is shown.

我已经在我的设置中打开了allow_url_fopen和allow_url_include,但仍然没有任何结果。 我尝试了多个提要,但最终都得到相同的结果?

我要疯了

php
5个回答
46
投票

simplexml_load_file()
XML 文件(磁盘上的文件或 URL)解释为对象。
$feed
中的内容是一个字符串。

您有两个选择:

  • 使用

    file_get_contents()
    获取字符串形式的 XML feed,并使用 e
    simplexml_load_string()
    :

     $feed = file_get_contents('...');
     $items = simplexml_load_string($feed);
    
  • 直接使用

    simplexml_load_file()
    :

    加载 XML feed
     $items = simplexml_load_file('...');
    

4
投票

如果您的服务器上未启用 file_get_contents,您还可以使用 cURL 加载内容。

示例:

$ch = curl_init();  

curl_setopt($ch,CURLOPT_URL,"http://feeds.bbci.co.uk/sport/0/football/rss.xml?edition=int");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$output = curl_exec($ch);

curl_close($ch);

$items = simplexml_load_string($output);

2
投票

这也有效:

$url = "http://www.some-url";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xmlresponse = curl_exec($ch);
$xml=simplexml_load_string($xmlresponse);

然后我只需运行一个 forloop 来从节点中获取内容。

像这样:`

for($i = 0; $i < 20; $i++) {
$title = $xml->channel->item[$i]->title;
$link = $xml->channel->item[$i]->link;
$desc = $xml->channel->item[$i]->description;
$html .="<div><h3>$title</h3>$link<br />$desc</div><hr>";
}
echo $html;

***请注意,显然,您的节点名称会有所不同......并且您的 HTML 结构可能会有所不同......而且您的循环可能会设置为更高或更低的结果量。


0
投票

2024 年更新。无论出于何种原因,其他加载文件的方法都不起作用,但这是有效的:

$request->file('invoice')->storePubliclyAs('xml/', 'invoice.xml');

$xml = simplexml_load_file('../storage/app/public/xml/invoice.xml');


-1
投票
$url = 'http://legis.senado.leg.br/dadosabertos/materia/tramitando';
$xml = file_get_contents("xml->{$url}");
$xml = simplexml_load_file($url);
© www.soinside.com 2019 - 2024. All rights reserved.