PHP生成动态sitemap出现xmlParseEntityRef: no name错误如何解决
问题原因及修复方案
错误根因
xmlParseEntityRef: no name是XML解析的典型报错,触发原因是XML内容中存在未转义的特殊字符(最常见的是&符号,XML中&是实体引用的开头,后面必须跟随合法的实体名称,单独出现就会触发该报错)。结合你的代码可定位到3个具体问题:
- 字符串替换逻辑错误:问题代码中
str_replace('','-',trim($row2['pagename_admit']))第一个参数是空字符串,完全没有起到替换空格的作用,和参考代码的str_replace(' ','-',...)(将空格替换为横杠)逻辑不符 - 未对输出到XML的内容做转义处理:如果
pagename_admit字段中包含&、<、>、'、"等XML保留字符,直接输出会破坏XML结构 - XML声明错误:当前的XML声明被包裹在注释标签
<!-- -->中,属于无效的XML头部
修复方案
按以下步骤修改代码即可解决报错:
- 修正XML声明,移除注释包裹,改为标准XML头部
- 修正字符串替换的参数,将空字符串改为空格,实现空格转横杠的效果
- 对所有输出到XML标签中的动态内容,使用
htmlspecialchars()函数转义XML特殊字符
修正后的代码片段
XML声明部分
// 移除注释包裹,改为标准XML头部 echo '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
循环输出部分
while($row2=mysqli_fetch_array($admit_result)){ // 先处理页面路径,修正空格替换逻辑 $page_path = 'localhost:8080/mysite/admitcard/'.$row2["id"].'/'.str_replace(' ','-',trim($row2['pagename_admit'])); echo '<url>' . PHP_EOL; // 对输出到XML的内容做转义处理 echo '<loc>'.htmlspecialchars($page_path).'</loc>' . PHP_EOL; echo '<lastmod>'.date('c',time()).'</lastmod>' . PHP_EOL; echo '<changefreq>daily</changefreq>' . PHP_EOL; echo '</url>' . PHP_EOL; }
内容的提问来源于stack exchange,提问作者Rishabh Raj
相关产品推荐
相关产品推荐

