2009-12-28 2 views
1

Я получаю ошибку XML: «В XML-документе разрешен только один элемент верхнего уровня». когда я пытаюсь запустить скрипт sitemap в PHP:Ошибка XML: разрешен только один элемент верхнего уровня

$num_rows = mysql_num_rows(mysql_query("SELECT * FROM pages_content WHERE date < CURRENT_TIMESTAMP")); 
$result = mysql_query("SELECT * FROM pages_content WHERE date < CURRENT_TIMESTAMP ORDER BY id DESC") or die("Query failed"); 
echo '<?xml version="1.0" encoding="UTF-8"?> 
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">';  
for($i=0;$i<$num_rows; $i++) {  
    $url_product = 'http://www.hostcule.com/'.mysql_result($result,$i,"title"); 

    echo' 
     <url> 
     <loc>'.$url_product.'</loc>  
     <changefreq>monthly</changefreq> 
     <priority>0.8</priority> 
     </url> 
    '; 

echo '</urlset>'; } 

Что в этом плохого?

ответ

4

Вам необходимо переместить закрытие '</urlset'> за пределы цикла for.

2

Эта линия является неправильной:

echo '</urlset>'; } 

Понадобится:

} 
echo '</urlset>'; 

Как вы закрываете верхние несколько раз уровня тегов, вы получаете эту ошибку.

2

Перед эхом нужно перемещать фигурные скобки }. Например:

$num_rows = mysql_num_rows(mysql_query("SELECT * FROM pages_content WHERE date < CURRENT_TIMESTAMP")); 
$result = mysql_query("SELECT * FROM pages_content WHERE date < CURRENT_TIMESTAMP ORDER BY id DESC") or die("Query failed"); 
echo '<?xml version="1.0" encoding="UTF-8"?> 
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">';  
for($i=0;$i<$num_rows; $i++) {  
    $url_product = 'http://www.hostcule.com/'.mysql_result($result,$i,"title"); 

    echo' 
     <url> 
     <loc>'.$url_product.'</loc>  
     <changefreq>monthly</changefreq> 
     <priority>0.8</priority> 
     </url> 
    '; 
}//<=To here 
echo '</urlset>'; // move this one =>} 
0

PHP - это язык шаблонов. Используйте его, чтобы создать свой вывод вместо того, чтобы возиться с конкатенированием строк. например .:

<?php 
    $result= mysql_query('SELECT * FROM pages_content WHERE date<CURRENT_TIMESTAMP ORDER BY id DESC') or die('Query failed'); 
?> 
<urlset> 
    <?php while ($row= mysql_fetch_assoc($result)) { ?> 
     <url> 
      <loc>http://www.hostcule.com/<?php urlencode($row['title']) ?></loc>  
      <changefreq>monthly</changefreq> 
      <priority>0.8</priority> 
     </url> 
    <?php } ?> 
</urlset> 

с последовательным углублением, как это, ошибки, как получение </urlset> в неправильном месте сразу становятся очевидны вместо боли для отладки.