Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [ajax] problema con il CDATA

    Cerco di semplificare all'osso il mio problema:

    In una pagina html si verifica un evento (click del mouse) che invoca una chiamata ajax passando un parametro al server.

    Lato server questo parametro viene analizzato e viene restituita una risposta tramite una XML al browser.

    La risposta che viene passata al browser contiene dei caratteri speciali tipo < e >.
    Questo perchè devo far restituire una tabella html e devo per forza usare i tag <table>.
    Dunque ho usato il costrutto CDATA in modo che la risposta venga considerata come un blocco di testo semplice e non come dei tag XML che si mischierebbero comprommettendo il parsing.
    ORA: lo script lato server funziona correttamente e anche il parsing della XML di risposta. Il problema è che quando questa risposta viene data in pasto al browser, anche lui me la considera semplice testo senza interpretando i tag HTML!

    Ecco quello che vedo dopo una chiamata ajax:



    vedete? la tabella e le div (che derivano dalla risposta ajax con cui ho usato il CDATA) vengono interpretate dal browser solo come testo semplice....

    La mia domanda è:
    E' possibile passare tag HTML all'interno dei tag XML senza usare CDATA? c'è un' altro metodo per fare ciò? Altre soluzioni??

    Io ho pensato di usare il metodo replace di javascript: quando ricevo la risposta ajax con la tabella purgo il codice togliendo CDATA. Ma questa soluzione non è molto pratica.. aspetto le vostre risposte

    grazie infinite

  2. #2
    potresti provare a non usare i CDATA, in questo caso devi precisargli una grammatica (probabilmente non devi ridefinire tutti i tag di xhtml ma almeno gli amp, altrimenti avrai un errore)
    Codice PHP:
          header("Content-type: text/xml"); 

        echo "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";

    //    echo "<!DOCTYPE data SYSTEM \"xxx.dtd\"";
    // oppure in linea

        
    echo "\n<!DOCTYPE data [";

        echo 
    "\n    <!ELEMENT data ( ...)>";
    ....
        echo 
    "\n    <!ATTLIST ..... CDATA #IMPLIED>";

        echo 
    "\n    <!ENTITY egrave \"&amp;egrave;\">";
        echo 
    "\n    <!ENTITY eacuta \"&amp;eacuta;\">";
        echo 
    "\n    <!ENTITY agrave \"&amp;agrave;\">";
        echo 
    "\n    <!ENTITY igrave \"&amp;igrave;\">";
        echo 
    "\n    <!ENTITY ugrave \"&amp;ugrave;\">";
        echo 
    "\n    <!ENTITY ograve \"&amp;ograve;\">";
        echo 
    "\n    <!ENTITY euro \"&amp;euro;\">";
        echo 
    "\n    <!ENTITY reg \"&amp;reg;\">";

        echo 
    "\n]>";
    io normalmente tuttavia racchiudo tutto in CDATA per levarmi ogni problema, e mi funziona.

    in questo caso lato server sarà (sempre in php)


    Codice PHP:
            echo "<data >";
        
            echo 
    "    <![CDATA[";

    // il tuo codice xhtml


        
    echo "    ]]>";

        echo 
    "</data>"
    lato client lo leggo così
    codice:
    	var obj_corpo = xml.getElementsByTagName("data");
    	if (obj_corpo.length > 0) {
                  ....
    		var childs = obj_corpo[0].childNodes;
    		var str = "";
    
    		for (var i = 0; i < childs.length; i++) 
    			str += printXML (childs[i], 1);
    
            	(il tuo div di inserimento).innerHTML = str;
                    .....
    	
            }
    la funzione printXML è una lettora ricorsiva del tuo html (che deve quindi essere valido)

    codice:
    // stampa l'xml ricorsivamente
    // curEl = il noto attuale
    // depth = profondità, alla prima chiamata è 1
        
    function printXML (curEl, depth)
    {
        
    	var loc_print="";
      
    	var tab = "";
        
    	if (curEl) {
        
    		var tagName = curEl.tagName;
    		
    		if (tagName) {
    			tag = tab + "<" + curEl.tagName ;
    			var attr = curEl.attributes;
    			
    			for (var i = 0; i < attr.length; i++) {
    				var nome = attr[i].nodeName;
    				var valore = curEl.getAttribute(nome);
    				tag += " " + nome + "=\"" + valore + "\"";
    			}
    			
    			tag += ">";
    		}  
    		else
    			tag = tab + curEl.nodeValue;
        
    		loc_print += tag;
    
    		var curElChild = curEl.childNodes;
        
    		for (var i = 0; i < curElChild.length; i++) {
    	        // attraversamento ricorsivo dei figli
            		loc_print += printXML(curElChild[i], depth+1);
    		}
     
    	}
      
    	// chiude il tag
    	if (tagName) {
    	        loc_print += tab + "</" + tagName + ">";
    	}
      
    	return loc_print;
    }
    spero che ti possa essere utile
    ciao
    sergio

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.