XML powaaa (CDATA)

Adoradores de la NES, seguidores del pingüino, Gafa-Pastas afiliados al iPod, histéricos del emule...
Avatar de Usuario
GorgarWillEatYou
moromielda
Mensajes: 190
Registrado: 24 Feb 2003 18:30

XML powaaa (CDATA)

Mensaje 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.
Última edición por GorgarWillEatYou el 27 Ago 2004 13:28, editado 1 vez en total.

Avatar de Usuario
curreta
Ulema
Mensajes: 5584
Registrado: 26 Abr 2003 10:27
Ubicación: Razón Aqui.

Mensaje por curreta »

Pero.... ¿Tu tienes un palo de polo?
A la vuelta pasé por al lado de la tuya casa, saqué la cabesa desde mi hauto y grité: CHURETICAS!

una bandada de gabiotar alzó el vuelo, el sol iba sumerjiendose entre las montañias y solo me contestó el eco de mi propia vos...

Avatar de Usuario
GorgarWillEatYou
moromielda
Mensajes: 190
Registrado: 24 Feb 2003 18:30

Mensaje por GorgarWillEatYou »

Yo és que solo tomo calippo de limón.

Avatar de Usuario
Perro De Lobo
Ente de HAMOR
Mensajes: 6134
Registrado: 02 Ago 2003 16:00
Ubicación: 40 24 59.878, -3 42 13.557
Contactar:

Mensaje 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)
He sido asaltado fieramente por la concupiscencia carnal

Avatar de Usuario
Juggernaut
Hombre de Mundo
Mensajes: 4904
Registrado: 02 Ago 2003 12:35
Ubicación: en una galaxia lejana, muy lejana

Mensaje 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.
Este es un mundo de estúpidos, controlados por imbéciles, para beneficio de mediocres.

Avatar de Usuario
Juggernaut
Hombre de Mundo
Mensajes: 4904
Registrado: 02 Ago 2003 12:35
Ubicación: en una galaxia lejana, muy lejana

Mensaje 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.
Este es un mundo de estúpidos, controlados por imbéciles, para beneficio de mediocres.

Avatar de Usuario
GorgarWillEatYou
moromielda
Mensajes: 190
Registrado: 24 Feb 2003 18:30

Mensaje 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).

Avatar de Usuario
Juggernaut
Hombre de Mundo
Mensajes: 4904
Registrado: 02 Ago 2003 12:35
Ubicación: en una galaxia lejana, muy lejana

Mensaje 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.
Este es un mundo de estúpidos, controlados por imbéciles, para beneficio de mediocres.

Avatar de Usuario
Juggernaut
Hombre de Mundo
Mensajes: 4904
Registrado: 02 Ago 2003 12:35
Ubicación: en una galaxia lejana, muy lejana

Mensaje 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!
Este es un mundo de estúpidos, controlados por imbéciles, para beneficio de mediocres.

Avatar de Usuario
Penetreitor
Mojahedín
Mensajes: 879
Registrado: 17 Sep 2003 12:19

Mensaje 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

Responder