Limitação do Mozilla com o XMLRequest

Pessoal,

tenho a seguinte situação:

  • Um servlet que retorna um XML, esse retorno tem em uma tag um texto, quando eu pego esse texto para carregar um textarea ele é cortado, o textarea não tem limitação de caracter, mesmo em um alert() o problema ocorre. Agora o curioso é que no responseText o texto juntamente com as outras tags do XML aparecem por completo, ou seja, tenho o XML completo no browser. Estou usando o seguinte código para pegar o texto do XML:
req.responseXML.getElementsByTagName("texto")[i].childNodes[0].nodeValue

Fato: Esse problema só ocorre no Mozilla, no IE funciona legal.

Me parece algum tipo de limitação do nodeValue do Mozilla.

Alguem já passou por essa situação e pode me dar uma dica do que poderia estar acontecendo?

Bom, não sei como está vindo seu texto xml, mas tente assim:

req.responseXML.getElementsByTagName("texto").item(i).firstChild.data;

Caso não funcione coloque aqui o texto xml de retorno.

E tenha sempre em mente que no IE dá pra fazer coisas que até Deus duvida, enquando no FF, geralmente, o mais lógico funciona.

Usa assim

req.responseXML.getElementsByTagName("texto")[0].firstChild.nodeValue;

Pessoal,

já tentei das duas formas, mas nada surtiu efeito.

Pô meu, manda aí o xml ou um trecho dele só pra ter uma idéia das tags.

Podes ver ele com um alert() no javascript.

Observe que o problema ocorre apartir de 4096 caracteres no retorno, quando o texto é inferior à isso ele funciona legal.

private String doCollectionEntityToXML(List colecao)
	{
		StringBuffer xml = new StringBuffer("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
		
		xml.append("<root>");
		xml.append("<status>");
		xml.append("Foram encontrados "+colecao.size()+" registros.");
		xml.append("</status>");
		xml.append("<statusSucesso>");
		xml.append("true");
		xml.append("</statusSucesso>");
		
		for(int i = 0; i < colecao.size(); i++)
		{
			xml.append("<mensagem>");
			
			xml.append("<id>");
			xml.append(((TermoConvenio)colecao.get(i)).getId());
			xml.append("</id>");
			
			xml.append("<dataInclusao>");
			xml.append(new SimpleDateFormat("dd/MM/yyyy").format(((TermoConvenio)colecao.get(i)).getDataInclusao()));
			xml.append("</dataInclusao>");
			
			xml.append("<dataAlteracao>");
			xml.append(new SimpleDateFormat("dd/MM/yyyy").format(((TermoConvenio)colecao.get(i)).getDataAlteracao()));
			xml.append("</dataAlteracao>");
			
			xml.append("<nomeLoginAlteracao>");
			xml.append(((TermoConvenio)colecao.get(i)).getLoginInfo().getNomeUsuario());
			xml.append("</nomeLoginAlteracao>");
			
			xml.append("<loginAlteracao>");
			xml.append(((TermoConvenio)colecao.get(i)).getLoginInfo().getLoginUsuario());
			xml.append("</loginAlteracao>");
			
			xml.append("<texto>");
			xml.append(htmlCharacterDecoder.getDecodedTextToHtml(((TermoConvenio)colecao.get(i)).getTexto()));
			xml.append("</texto>");
			
			xml.append("</mensagem>");
		}
		
		xml.append("</root>");
		
		return xml.toString();
	}

Caso o seu exemplo seja parecido:

function initRequest(url) {		    	  
if (window.XMLHttpRequest) {
   req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
   req = new ActiveXObject("Microsoft.XMLHTTP");
}
 req.open("GET", url, true);	    	  		}
}

Faça o seguinte troque isso

req.open("GET", url, true);	

por isso

req.open("POST", url, true);

Então,

o problema está no retorno, e não no envio, mesmo assim eu substituí GET pelo POST, mas não resolveu tbem…

Veja no console javascript do FF qual é a mensagem de erro e a linha.

Vou te passar o fonte do servlet e do jsp que eu fiz aqui e que funciona no IE e no FF ok?

Trecho do servlet:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        StringBuffer sb = new StringBuffer("");
        
        sb.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
        sb.append("<dados>\n");
        sb.append(" <atividade>\n");
        sb.append("  <teste>valor1</teste>\n");
        sb.append(" </atividade>\n");
        sb.append(" <atividade>\n");
        sb.append("  <teste>valor2</teste>\n");
        sb.append(" </atividade>\n");
        sb.append(" <atividade>\n");
        sb.append("  <teste>valor3</teste>\n");
        sb.append(" </atividade>\n");
        sb.append("</dados>");
        out.println(sb);
        out.flush();
        out.close();
    }

Trecho do jsp:


    <script language="JavaScript">  
        var tXHR=0;

        function XMLHTTPRequest() {
          if (window.XMLHttpRequest) { 
              a=new XMLHttpRequest(); } //Objeto nativo (FF/Safari/Opera7.6+)
          else {
            try { 
               a=new ActiveXObject("Msxml2.XMLHTTP");  //activeX (IE5.5+/MSXML2+)
            }   
            catch(e) {
              try { 
                 a=new ActiveXObject("Microsoft.XMLHTTP"); //activeX (IE5+/MSXML1)
              }   
              catch(e) { /* O navegador não tem suporte */ 
                 a=false; 
              }
            }
          } 
          return a;
        }

        function Teste() {
            tXHR=XMLHTTPRequest();
            if (tXHR) {
                tXHR.open("POST", "<seu servlet>/Teste", true);    
                tXHR.onreadystatechange=recebeResultado;
                tXHR.send(null);
            }
        }
        
        function recebeResultado() {
            if (!tXHR) {
                return false;
            }
            else {
                if (tXHR.readyState == 4) {             
                    if (tXHR.status == 200) {
                        var tag = tXHR.responseXML.getElementsByTagName("atividade");
                        alert("Valor da primeira tag teste: " + tag[0].getElementsByTagName("teste").item(0).firstChild.data);
                        alert("Valor da segunda tag teste: " + tag[1].getElementsByTagName("teste").item(0).firstChild.data);
                        alert("Valor da terceira tag teste: " + tag[2].getElementsByTagName("teste").item(0).firstChild.data);
                    }
                    else {
                        alert('Erro! "'+ tXHR.statusText +'" (erro '+ tXHR.status +')'); 
                    }
                }    
            }
        }

    </script>        

Pra você testar chame a função javascript Teste.
Tente executar esse exemplo no seu servlet e veja se alcança o mesmo resultado. Qualquer coisa dê um berro.