无论我尝试什么,&变成&在XML中

时间:2012-01-19 23:56:36

标签: php xml sitemap

我创建了一个站点地图,我的问题是链接中的所有&都更改为&

我已经创建了一个修复此功能的函数,它可以在我网站的其他部分工作,但XML文档中的网址不会改变。

此部分htmlspecialchars($query_string);是问题所在。 我已经测试过:

  • esc_url(wordpress)
  • urlencode
  • ヶ辆
  • 用htmlspecialchars

这是我的代码

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');
  }

我做错了什么?

4 个答案:

答案 0 :(得分:2)

听起来不错:&reserved character in XML:

  

&符号(&amp;)和左尖括号(&lt;)仅在用作标记分隔符时或在注释,处理指令或CDATA部分中时才以其文字形式出现。如果在其他地方需要它们,则必须使用数字字符引用或字符串“&amp;”进行转义。和“&lt;”分别。

它可能是XML库正在做的,而不是你的转义函数。

这基本上是正确的,读取文件的XML解析器应该将其解码回来。

如果它不适用于您,请将URL字段包装在CDATA标记中。

答案 1 :(得分:1)

你没有做错任何事。在XML中,&始终表示为&amp;

答案 2 :(得分:0)

好消息是,如果您要为Google制作网站地图,则无论如何都需要转义(转而进入&amp;)。不要打它。 见http://www.maxi-pedia.com/how+to+create+a+Google+sitemap

答案 3 :(得分:-1)

&安培;是xml的无效字符,因此需要将其转换为&amp;,否则会破坏您的xml结构。

因此,当您使用&amp;符号解码XML属性时,只需使用php方法html_entity_decode(),它就会将所有编码字符还原为真实字符。