Página 1 de 2

XML powaaa (CDATA)

Publicado: 27 Ago 2004 13:19
por GorgarWillEatYou
Ueeeh!
Primero de todo,espero que alguien sepa de que hablo.´
Tengo una página en Flash que lee de una base de datos en XML para todo lo que son notícias e información varia. Los Xml están construïdos mediante PHP, que lee desde la BBDD.
El problema que tengo és que no puedo usar en las notícias apóstrofes, paréntesis o otros símbolos porqué entonces se cascan las hojas XML.

He leido del uso del comando CDATA, que hace que el XML no interprete estos símbolos como parte de la programación, sino como texto, però no se como se usa.

El código del PHP sería el siguiente:

Código: Seleccionar todo

<?
function updateXML(){
   //nombre del xml
   $xml = "noticies.xml";
   $res = mysql_query("SELECT id,titol, capsalera, text, data, autor FROM noticies ORDER BY data DESC, id DESC")or die(mysql_error());
   if( mysql_num_rows ($res) > 0 ){
      $salida = "<?xml version='1.0' encoding='UTF-8'?>\n <noticias>\n";
      //organizador por fecha
      $cid = 0;
      while(list($id,$titol ,$capsalera,$text,$data,$autor) = mysql_fetch_array($res)){
         //revisamos si hay cambio de fecha.
         if($id != $cid){
            //si es la primer fecha.
            if($cid == 0){
               //es la primer etiqueta.
               $salida .= "\t<noticia titulo='
".utf8_encode($titol).">\n";
            }else{
               //no es la primer fecha, cerramos la etiqueta anterior y ponemos la nueva.
               $salida .="\t</noticia>\n\t<noticia titulo='".utf8_encode($titol)."'>\n";
            }
            //actualizamos cfecha.
            $cid = $id;
         }//fin if de fecha.
         
         //datos normales.
         $salida .= "\t\t<datos id='$id' cabecera='".utf8_encode($capsalera)."' texto='".utf8_encode($text)."' fecha='$data' autor='".utf8_encode($autor)."'/>\n";
      }//fin del while
      //fin del xml
      $salida .="\t</noticia>\n</noticias>";
      //abrimos el fichero.
      $fp = fopen($xml,"w");
      //escribimos el contenido de $salida en el.
      fwrite($fp,$salida);
      //cerramos el fichero
      fclose($fp);
   }else{
      //no hay registros borramos la agenda
      //revisamos si el archivo existe
      if( is_file($xml)){
         //si existe lo borramos
         unlink ($xml);
      }
   }//fin if/else de resltados
} // end func ?>

Por lo que he leido, el CDATA deberia ir así:

Código: Seleccionar todo

$salida .= "\t<noticia titulo='
CDATA[".utf8_encode($titol)."]'>\n";

Pero lo único que consigo es que aparezca en el XML la palabra CDATA en cada nódulo seguido de lo que realmente tendría que haber.


snifff, (potato) soy yo.

Publicado: 27 Ago 2004 13:27
por curreta
Pero.... ¿Tu tienes un palo de polo?

Publicado: 27 Ago 2004 13:36
por GorgarWillEatYou
Yo és que solo tomo calippo de limón.

Publicado: 27 Ago 2004 13:49
por Perro De Lobo
Cuidado con los helados de vainilla, que el otro día me enteré de que para intensificar el aroma y el sabor, le añaden una sustancia llamada escatol.
Y sí, el nombre da una idea bastante clara de su procedencia. Por lo visto, la olorosa fragancia de un humeante chorizo cular, en pequeñas dosis, resulta un atrayente perfume para nuestros sibaritas olfatos.

Así que si os comeis un magnum, en realidad estais degustando compulsivamente un ñordo recubierto de crujiente chocolate con avellanas (o altramuces, si es un magnum del lidl)

Publicado: 27 Ago 2004 14:08
por Juggernaut
Jurjurjur, pobre Gorgar.

En menudo lío te has metido.

A ver, lo que pasa es que el cabron del flash, para XML, trabaja en UTF-16, y no hay cristo que lo haga cambiar. Y el PHP suele hacerlo con el LATIN-1-noseque.

El método más correcto de hacerlo es:

Que PHP, al crear el XML, use la función "escape" para todos los valores de los atributos de los nodos.

La función escape, por si no sabes lo que es, convierte esto:

Código: Seleccionar todo

áéíóú jódete cabrón


en esto:

Código: Seleccionar todo

%E1%E9%ED%F3%FA%20j%F3dete%20cabr%F3n


Seguro que te suena de habérselo visto al explorer.

Aluego, cuando recibas el XML en Flash, que antes de usar los valores de los atributos de los nodos, llame a la función "unescape".

algo así como "unescape(nodeXML.firstChild.attibutes.nombre)"

Ojo, el cabrón del flash "unescapa" mal el carácter "+", el más. Con ese vas a tener que hacer algo especial.

Si lo consigues limpiamente, avisa, que serás el primero que no se la pega contra el mismo jodido problema.

Publicado: 27 Ago 2004 14:12
por Juggernaut
Ups, acabo de ver que, en php, no es "escape", como en tooodos los demás, sino que se llama urlencode

Vale, es lo mismo.

Publicado: 27 Ago 2004 16:31
por GorgarWillEatYou
Juggernaut escribió:Ojo, el cabrón del flash "unescapa" mal el carácter "+", el más. Con ese vas a tener que hacer algo especial.

El "+" no sé, pero me ha jodido todas las tildes i la nostra estimada "ç" (ce rota, para los no catalanes).

Publicado: 27 Ago 2004 16:34
por Juggernaut
GorgarWillEatYou escribió:
Juggernaut escribió:Ojo, el cabrón del flash "unescapa" mal el carácter "+", el más. Con ese vas a tener que hacer algo especial.

El "+" no sé, pero me ha jodido todas las tildes i la nostra estimada "ç" (ce rota, para los no catalanes).


jum... veo que ibas del palo "encode_utf8" por ahí... a ver si va a ser eso, has combinasiones, quita y pon...

Si no te chuta, te pasaré un codiguillo que yo usé, que hace la sustitución a mano.

Y si no, siempre te queda el palo de polo.

Publicado: 27 Ago 2004 16:42
por Juggernaut
Bueno, mejor te lo paso directamente, porque no está ahí el problema, he recordado que aunque hicieras escapes y unescapes, tampoco lo hacía bien el cabrón.

Es ASP, tendrás que tunearlo para PHP, eh?

Código: Seleccionar todo

function ANSI(ent)

   dim Final
   
      Final=ent
   
      Final=Replace(Final,chrw(195) & chrw(160),"à")
      Final=Replace(Final,chrw(195) & chrw(168),"è")
      Final=Replace(Final,chrw(195) & chrw(172),"ì")
      Final=Replace(Final,chrw(195) & chrw(178),"ò")
      Final=Replace(Final,chrw(195) & chrw(185),"ù")
      
      Final=Replace(Final,chrw(195) & chrw(161),"á")
      Final=Replace(Final,chrw(195) & chrw(169),"é")
      Final=Replace(Final,chrw(195) & chrw(173),"í")
      Final=Replace(Final,chrw(195) & chrw(179),"ó")
      Final=Replace(Final,chrw(195) & chrw(186),"ú")
      
      Final=Replace(Final,chrw(195) & chrw(162),"â")
      Final=Replace(Final,chrw(195) & chrw(170),"ê")
      Final=Replace(Final,chrw(195) & chrw(174),"î")
      Final=Replace(Final,chrw(195) & chrw(180),"ô")
      Final=Replace(Final,chrw(195) & chrw(187),"û")
      
      Final=Replace(Final,chrw(195) & chrw(164),"ä")
      Final=Replace(Final,chrw(195) & chrw(171),"ë")
      Final=Replace(Final,chrw(195) & chrw(175),"ï")
      Final=Replace(Final,chrw(195) & chrw(182),"ö")
      Final=Replace(Final,chrw(195) & chrw(188),"ü")
      
      Final=Replace(Final,chrw(195) & chrw(128),"À")
      Final=Replace(Final,chrw(195) & chrw(136),"È")
      Final=Replace(Final,chrw(195) & chrw(140),"Ì")
      Final=Replace(Final,chrw(195) & chrw(146),"Ò")
      Final=Replace(Final,chrw(195) & chrw(153),"Ù")
      
      Final=Replace(Final,chrw(195) & chrw(129),"Á")
      Final=Replace(Final,chrw(195) & chrw(137),"É")
      Final=Replace(Final,chrw(195) & chrw(141),"Í")
      Final=Replace(Final,chrw(195) & chrw(147),"Ó")
      Final=Replace(Final,chrw(195) & chrw(154),"Ú")
      
      Final=Replace(Final,chrw(195) & chrw(130),"Â")
      Final=Replace(Final,chrw(195) & chrw(138),"Ê")
      Final=Replace(Final,chrw(195) & chrw(142),"Î")
      Final=Replace(Final,chrw(195) & chrw(148),"Ô")
      Final=Replace(Final,chrw(195) & chrw(155),"Û")
      
      Final=Replace(Final,chrw(195) & chrw(132),"Ä")
      Final=Replace(Final,chrw(195) & chrw(139),"Ë")
      Final=Replace(Final,chrw(195) & chrw(143),"Ï")
      Final=Replace(Final,chrw(195) & chrw(150),"Ö")
      Final=Replace(Final,chrw(195) & chrw(156),"Ü")
      
      Final=Replace(Final,chrw(195) & chrw(167),"ç")
      Final=Replace(Final,chrw(195) & chrw(135),"Ç")
      
      Final=Replace(Final,chrw(194) & chrw(186),"º")
      Final=Replace(Final,chrw(194) & chrw(170),"ª")
      
      Final=Replace(Final,chrw(195) & chrw(177),"ñ")
      Final=Replace(Final,chrw(195) & chrw(145),"Ñ")
      
      Final=Replace(Final,chrw(194) & chrw(183),"·")
   
   ANSI=Final
   
End Function


La función chrw es la función que devuelve un código de carácter en unicode.

Normalmente no te ayudaría tanto, pero es que has topado justo con algo con lo que me he vuelto loco hasta que he conseguido que funcione. Y ojalá hubiera encontrado a alguien que me lo explicara.

A ver si hay suerte y te sirve!

Publicado: 27 Ago 2004 20:02
por Penetreitor
Varias cosas

a) Me niego a admitir que flash no soporte utf-8.
b) Aunque sea una chorrada (y precisamente por eso) cambia las ' por ".
c) Yo usaría DOM para crear el XML. Pero esto es algo personal.
d) No tengo idea (ni tendré) de Flach