我创建了一个站点地图,我的问题是链接中的所有&
都更改为&
我已经创建了一个修复此功能的函数,它可以在我网站的其他部分工作,但XML文档中的网址不会改变。
此部分htmlspecialchars($query_string);
是问题所在。
我已经测试过:
这是我的代码
public function buildSiteMap($type = '', $num = '30') {
include_once(INCLUDE_DIR.'library.php');
$result = parent::buildSiteMap($type, $num);
$entity = str_replace('sl_','',$type);
$xml = new SimpleXMLElement('<urlset></urlset>');
$xml->addAttribute('encoding', 'UTF-8');
$xml->addAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
foreach($result as $res):
$name = str_replace(' ','+',$res['name']);
$query_string = $entity.'='.$name.'&'.$entity.'id='.$res['id'];
$url = home_url().'/'.$entity.'/?'.urlencode($query_string);
$make = $xml->addChild('url');
$make->addChild('loc',$url);
$make->addChild('priority','0.80');
$make->addChild('changefreq','monthly');
endforeach;
$dir = get_template_directory();
$xml->asXML($dir.'/'.$entity.'.xml');
}
我做错了什么?
答案 0 :(得分:2)
听起来不错:&
是reserved character in XML:
&符号(&amp;)和左尖括号(&lt;)仅在用作标记分隔符时或在注释,处理指令或CDATA部分中时才以其文字形式出现。如果在其他地方需要它们,则必须使用数字字符引用或字符串“&amp;”进行转义。和“&lt;”分别。
它可能是XML库正在做的,而不是你的转义函数。
这基本上是正确的,读取文件的XML解析器应该将其解码回来。
如果它不适用于您,请将URL字段包装在CDATA标记中。
答案 1 :(得分:1)
你没有做错任何事。在XML中,&
始终表示为&
。
答案 2 :(得分:0)
好消息是,如果您要为Google制作网站地图,则无论如何都需要转义(转而进入&
)。不要打它。
见http://www.maxi-pedia.com/how+to+create+a+Google+sitemap
答案 3 :(得分:-1)
&安培;是xml的无效字符,因此需要将其转换为&
,否则会破坏您的xml结构。
因此,当您使用&
符号解码XML属性时,只需使用php方法html_entity_decode()
,它就会将所有编码字符还原为真实字符。