XML与PHP“echo”获取错误“文档末尾的额外内容”

时间:2014-01-31 14:24:39

标签: php xml

我在这里问了一个关于如何Generate a sitemap automatically, does it need to be XML?

的问题

以下是我们得出的解决方案:

<?php
header ("Content-Type:text/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
        // code to extract and echo links from the file 
echo '   </urlset>';
?>

<?PHP
  // Original PHP code by Chirp Internet: www.chirp.com.au
  // Please acknowledge use of this code by including this header.

  $url = "assets/includes/menu.inc";
  $input = @file_get_contents($url) or die("Could not access file: $url");
  $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
  if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
    foreach($matches as $match) {
      // $match[2] = link address
      // $match[3] = link text 
      echo '<url><loc>' . $match[2] . '</loc></url>';
    }
  }
?>

但是,当我尝试时,它会显示错误:http://postimg.org/image/gh5d0k4sx/ - 我尝试删除顶行“header ("Content-Type:text/xml");”并且它有效,但是我可以删除该行吗?整个事情是为了SEO所以我不知道我们是否可以删除顶线,我做错了什么?

另一个问题:此文件现在被识别为XML文件吗?即使它有.php扩展名?

2 个答案:

答案 0 :(得分:4)

您的PHP不会被浏览器接收,因为它是服务器端语言。

header function不会修改页面正文。但是保持它是很重要的,否则浏览器将无法将文档识别为XML。

尝试在脚本的两个部分之间删除关闭和打开PHP标记。它们之间的空白可能会导致您的错误。

?>

<?PHP

修改:点击评论后,请等到您在关闭<url>之前输出urlset代码

将该行移至PHP的底部:

echo '   </urlset>';

理解如何使用换行符和双引号来实现类似的效果也符合干净XML的最佳利益。

答案 1 :(得分:0)

抓取工具不会抓取该文件。 根据{{​​3}}的站点地图规范。 文件名必须是sitemap.xml。

我建议用

创建文件“sitemap.xml”
file_put_contents("sitemap.xml", $xmlContent);

静态文件更快,您可以重新创建它。

如何在linux上创建cronjob?

  • on shell使用cronjob -e
  • 您的编辑器打开
  • 添加新的cronjob行,例如:00 22 * * * /path/to/sitemapBuilder.php
  • 这意味着:每天22:00执行您的站点地图生成脚本

sitemapBuilder.php的内容:

<?php 
 $xml = '<?xml version="1.0" encoding="UTF-8"?>
             <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

 $url = "assets/includes/menu.inc";
 $input = @file_get_contents($url) or die("Could not access file: $url");

 $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";

 if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
     foreach($matches as $match) {
         // $match[2] = link address
         // $match[3] = link text
         $xml .= '<url><loc>' . $match[2] . '</loc></url>';
     }
 }
 $xml .= '</urlset>';
 file_put_contents('sitemap.xml', $xml);
 ?>

将sitemap.xml写入您的Web项目的根文件夹,例如在index.php旁边。

您也可以使用Sitemap验证程序指向您的网址并检查文件的有效性。 例如,http://www.sitemaps.org/protocol.html可能有助于此。