XML和&符号

时间:2011-11-19 20:17:09

标签: php xml

我有一个关于“&”的问题符号:

我有这种格式的返回网址:

http://localhost/index.php?task=payment_return&id=113&token=750ac376e9ee1f6e87eba80c409005c4

我在PHP函数中将其设置为XML,位于“url-retorno”:

private function XMLUrlRetorno() {
    // $msg = '<url-retorno>' . $this->getData('url_retorno') . '</url-retorno>';
    $msg = '<url-retorno>' . str_replace('&', '&amp;', $this->getData('url_retorno')) . '</url-retorno>';
    return $msg;
}

好的,但问题是“&amp;”,如果我的网址是用这种格式写的:

http://localhost/index.php?task=payment_return&id=113&token=750ac376e9ee1f6e87eba80c409005c4

或者

http://localhost/index.php?task=payment_return&amp;id=113&amp;token=750ac376e9ee1f6e87eba80c409005c4

我从XML中收到此错误:

error: Unexpected end of file after url-retorno

我尝试过htmlspecialchar,使用str_replace('&amp;',..)并再次出错..

怎么做,如果'url-retorno'没有“&amp;”它有效,但如果有,不是吗?

XML发送:

<?xml version="1.0" encoding="ISO-8859-1"?>
<requisicao-transacao id="c1303587fb566fdec7ae480f5b8d3e04" versao="1.1.0">
  <dados-ec>
    <numero>0000000000</numero>
    <chave>a00000000a0000000000a0000000aa0000a0000000000a0aaa0a0000aa0aa000</chave>
  </dados-ec>
  <dados-pedido>
    <numero>185</numero>
    <valor>15</valor>
    <moeda>986</moeda>
    <data-hora>2011-11-20T13:57:51</data-hora>
    <descricao>185 - teste: 1 x $15.00</descricao>
    <idioma>PT</idioma>
  </dados-pedido>
  <forma-pagamento>
    <bandeira>visa</bandeira>
    <produto>1</produto>
    <parcelas>1</parcelas>
  </forma-pagamento>
  <url-retorno>http://localhost/index.php?task=payment_return&amp;id=185&amp;token=4babfe87206d14cc88220810d44bbb28</url-retorno>
  <autorizar>3</autorizar>
  <capturar>1</capturar>
</requisicao-transacao>

XML响应:

<?xml version="1.0" encoding="ISO-8859-1"?>
<erro xmlns="http://ecommerce.cbmp.com.br">
  <codigo>001</codigo>
  <mensagem>XML inválido: 'error: Unexpected end of file after url-retorno'.</mensagem
</erro>

2 个答案:

答案 0 :(得分:2)

xml标记不接受某些字符(请阅读此read this link。)

当您使用未转义的字符时,请使用htmlspecialchars或相反的方法对其进行编码以对其进行转义。

答案 1 :(得分:1)

只需在xml中使用cdata标签

 <![CDATA[
       Your url with & in it
     ]]>

这应该在您的代码中看起来像这样,并且完全符合xml。

    private function XMLUrlRetorno() {
        $msg = '<url-retorno><![CDATA[' . $this->getData('url_retorno') . ']]></url-retorno>';
        return $msg;

}