Wordpress simplexml_load_file()解析错误

时间:2013-05-15 23:56:49

标签: xml wordpress parsing rss feed

所以我有一个杀手问题。我无法显示此xml数据。它工作3个月前,现在不是。任何修复这个bugger的建议都可以帮到我!#/ p>

是的 - 我已经检查过链接是否正常工作,并且确实存在。

<?php 
if(file_exists('http://blog.millcitychurch.org/blog/rss.xml')){ ?>
        <h1>// THE  LATEST  FROM   MILL city</h1>

    <div class="feed">


            <?php 
            $xml = file_get_contents('http://blog.millcitychurch.org/blog/rss.xml'); 

            $url = 'http://blog.millcitychurch.org/blog/rss.xml';
            $rss = simplexml_load_file($xml);


            if($rss) {


                    $items = $rss->channel->item;
                    $i = 0;

                    foreach($items as $item) {


                        if (++$i > 4) {
                             // stop after 5 loops
                            break;
                        }



                        $title = $item->title;
                        $link = $item->link;


                        $published_on = $item->pubDate;
                        $description = strip_tags($item->description);


                        $position=215; // Define how many character you want to display.
                        $message = $description;
                        $post_content = substr($message, $position, 1);


                        $post_content = substr($message,0,$position); // Display your message


                        echo '<div class="feed-desc">' ;
                        echo '<h2>'.$title.'</h2><p>';
                        echo $post_content;
                        echo '</p><div class="readmore"><a href="'.$link.'">... read more</a></div>';
                        echo '<div class="date">'.$published_on.'</div>';
                        echo '</div>';

                    }


                } ?>



        </div><! -- end .feed -->
        <?php } ?>

1 个答案:

答案 0 :(得分:1)

我注意到主机最近在file_get_contents调用中变得越来越严格。几个月前工作的电话现在无法正常工作。

最好的解决方案是通过curl拨打电话,一旦你设置好就不会太糟糕。

示例代码:

$htmlFile = curl('http://blog.millcitychurch.org/blog/rss.xml');


function curl($url)
{       
  //Absolute Hosting Path
  $absHostingPath = '/home/content/your_server_path/html';

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

  curl_setopt($ch, CURLOPT_TIMEOUT, 20); 
  curl_setopt($ch, CURLOPT_USERAGENT, array('User-Agent' => 'My User Agent'));
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); 
  curl_setopt($ch, CURLOPT_CAINFO, $absHostingPath."/certs/cacert.pem");

  $data = curl_exec($ch);

  $curlError = curl_error($ch);
  if(strlen($curlError) > 0)
    print(' Curl error: ' .$curlError.'  ');

   curl_close($ch);
   return $data;
}
curl()的调用返回时,$ htmlFile将拥有该文件的内容。

您可以从主机帐户控制面板获取服务器的绝对托管路径。 用户代理不是太重要,特别是如果它是您的服务器。

棘手的部分是证书文件。您可以从以下方面获得“标准”ca证书: http://curl.haxx.se/docs/caextract.html

如果您打电话给自己的服务器,您应该能够创建自己的自签名证书: http://www.tldp.org/HOWTO/SSL-Certificates-HOWTO/x160.html

根据CURLOPT_CAINFO中的调用将证书复制到/ certs目录并命名(参见上面的代码)。

您还可以将CURLOPT_SSL_VERIFYPEER更改为FALSE而不使用证书,但这将完全关闭验证,这不被认为是安全的(使用风险自负)(有关详细信息,请参阅http://php.net/manual/en/function.curl-setopt.php)。

希望有所帮助!