Foros del Web » Programando para Internet » PHP »

XML con CDATA en PHP no funciona!!!

Estas en el tema de XML con CDATA en PHP no funciona!!! en el foro de PHP en Foros del Web. Buenas a todos, antes que nada quiero decir que si este tema ya lo tocaron, no lo encontré, asi que si alguien me puede redirigir, ...
  #1 (permalink)  
Antiguo 11/05/2011, 12:28
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta XML con CDATA en PHP no funciona!!!

Buenas a todos, antes que nada quiero decir que si este tema ya lo tocaron, no lo encontré, asi que si alguien me puede redirigir, buenísimo. Bueno, el problema que tengo es que tengo que crear un foro en PHP, guardando las entradas en xml, la estructura del xml es la siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<tema>

<comentario valor="Principal">
<usuario>Ale</usuario>
<nombretema>Primer Tema</nombretema>
<contenido><![CDATA[Texto sin problemas]]></contenido>
</comentario>

<comentario>
<usuario>Ale</usuario>
<nombretema>Respuesta Primer Tema</nombretema>
<contenido><![CDATA[Otro texto sin problemas...]]></contenido>
</comentario>

<comentario>
<usuario>Ale</usuario>
<nombretema>Respuesta Primer Tema</nombretema>
<contenido><![CDATA[Con el siguiente acento se va todo a la mier... ]]></contenido>
</comentario>

</tema>

Como podrán apreciar, esta todo ok (o al menos yo lo veo ok). Si prestan atención a los comentarios, dentro del 1º y el 2º hay contenido que no da problemas, hasta que llego al 3, pongo un acento y adiós armonía. el error que me sale es el siguiente:

( ! ) Warning: DOMDocument::load() [domdocument.load]: Input is not proper UTF-8, indicate encoding ! Bytes: 0xE1 0x5D 0x5D 0x3E in file:///C:/wamp/www/Foro%20PHP%20&%20XML/temas/Primer%20Tema.xml, line: 8 in C:\wamp\www\Foro PHP & XML\visualizartema.php on line 17
Call Stack
# Time Memory Function Location
1 0.0015 392880 {main}( ) ..\visualizartema.php:0
2 0.0021 394184 DOMDocument->load( ) ..\visualizartema.php:17

El código que uso para visualizar el archivo es el siguiente:

foreach($tema as $com){
$comentario = $com->getElementsByTagName("comentario");
if($comentario->item(0)->hasAttribute("valor")){
$nombreprincipal = $archivo->getElementsByTagName("nombretema");
$_SESSION["nombretema"] = $nombreprincipal->item(0)->nodeValue;
}
foreach($comentario as $ele){
$usuario = $ele->getElementsByTagName("usuario");
$nombretema = $ele->getElementsByTagName("nombretema");
$contenido = $ele->getElementsByTagName("contenido");

echo "Usuario:<strong> ".$usuario->item(0)->nodeValue."</strong><br/><br/>";
echo "Nombre del Tema:<strong> ".$nombretema->item(0)->nodeValue."</strong><br/><br/>";
echo "Contenido:<br/>".$contenido->item(0)->nodeValue. "<br/><br/>";
}
}

Les agradecería que si alguien sabe como solucionar el error que me da, que me lo diga!!! muchas gracias gente! a ver si en este, mi segundo tema creado en este foro, encuentro la respuesta... salud!
  #2 (permalink)  
Antiguo 11/05/2011, 13:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: XML con CDATA en PHP no funciona!!!

¿Como generas ese XML? Creo al parecer el problema esta ahí y no en la lectura del XML.

Saludos.
  #3 (permalink)  
Antiguo 11/05/2011, 13:39
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

lo genero con el mismo php, el código es:

$archivotema = new DOMDocument("1.0", "UTF-8");//crea el temporal de xml sin nombre ni na'a

$nuevo = $archivotema->createElement("tema");//crea el root del xml
$nuevo = $archivotema->appendChild($nuevo);//agrega el root al archivo temporal de xml
$nuevocomentario = $archivotema->createElement("comentario");//crea un contenedor para toda la información del comentario, usuario, nombre del tema y contenido
// Creo el atributo
$atributo = $archivotema->createAttribute("valor");
// Se lo acoplo al elemento "contactos"
$nuevocomentario->appendChild($atributo);
// Creo el texto
$atributo_valor = $archivotema->createTextNode("Principal");
// Se lo asigno al atributo
$atributo->appendChild($atributo_valor);
$nuevousuario = $archivotema->createElement("usuario", $usu);//crea el elemento usuario con su informacion
$nuevonombretema = $archivotema->createElement("nombretema", $nom);//crea el elemento nombretema con su informacion
$nuevocontenido = $archivotema->createElement("contenido");//crea el elemento contenido
$cdata = $archivotema->createCDATASection($con);//crea una seccion de CDATA con su informacion, es decir, el contenido del tema
$nuevocontenido->appendChild($cdata);//agrega la seccion de CDATA al elemento "contenido"

//lo que sigue es el ensamble de los elementos principales
$nuevocomentario->appendChild($nuevousuario);//agrega el elemento ususario al elemento "comentario"
$nuevocomentario->appendChild($nuevonombretema);//agrega el elemento nombretema al elemento "comentario"
$nuevocomentario->appendChild($nuevocontenido);//agrega el elemento contenido al elemento "comentario"
$nuevo->appendChild($nuevocomentario);//agrega el elemento comentario al root del xml
$archivotema->save("temas/".$nom.".xml");//guarda el archivo creado con los cambios realizados
  #4 (permalink)  
Antiguo 11/05/2011, 14:26
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

me falto comentar que en el archivo xml, en el tercer comentario, luego de los puntos suspensivos había una "a" con acento, osea "á", que no la guardó y que aparte generó todo el error...
  #5 (permalink)  
Antiguo 11/05/2011, 14:40
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: XML con CDATA en PHP no funciona!!!

buenas,
sospecho que debe ser porque el contenido agregado en CDATA no esta codificado en utf-8 el cual es la codificacion que estas indicando que tiene el documento XML. prueba a cambiar la codificacion a iso-8859-1 o a codificar el contenido a utf-8.

si te fijas en el mensaje de error, te esta diciendo que la secuencia 0xE1 0x5D 0x5D 0x3E (el cual es á]]>) no es una entrada apropiada para utf-8. en utf-8 la secuencia de bytes deberia ser 0xC3 0xA1 0x5D 0x5D 0x3E.

__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #6 (permalink)  
Antiguo 11/05/2011, 14:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: XML con CDATA en PHP no funciona!!!

Prueba usar utf8_encode sobre la variable del comentario antes de pasarlo al nodo de CData.

Saludos.
  #7 (permalink)  
Antiguo 11/05/2011, 17:46
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

y como hago para codificar el cdata? con un "enconding" en "contenido" o en otro lugar? y como le indico el encoding? con indicando atributo o con otra orden? gracias!
  #8 (permalink)  
Antiguo 11/05/2011, 18:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: XML con CDATA en PHP no funciona!!!

Lee mi comentario anterior, necesitas usar la función utf8_encode para eso:
Código PHP:
Ver original
  1. $cdata = $archivotema->createCDATASection(utf8_encode($con));//crea una seccion de CDATA con su informacion, es decir, el contenido del tema

Saludos.
  #9 (permalink)  
Antiguo 11/05/2011, 20:01
(Desactivado)
 
Fecha de Ingreso: abril-2011
Mensajes: 153
Antigüedad: 13 años, 6 meses
Puntos: 236
Respuesta: XML con CDATA en PHP no funciona!!!

Hola,
Prueba cambiar UTF-8 por ISO-8859-1 a mí nunca me ha dado problemas ISO-8859-1 y cuándo vallas a mostrar los datos usa utf8_decode();, para mostrar los acentos y esos carácteres especiales, saludos.
  #10 (permalink)  
Antiguo 12/05/2011, 10:50
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

que buena onda gente! voy a probar lo del utf8_encode y les cuento como fue
  #11 (permalink)  
Antiguo 12/05/2011, 15:42
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

Buenísimo!!! al final funcionó todo pipicucu, la cosa quedó así:
el código para crear el archivo xml:

if(isset($_POST['crear'])){
$usu=$_SESSION["usuario"];
$nom=$_POST["nombretema"];
$con=$_POST["contenido"];

$archivotema = new DOMDocument("1.0", "UTF-8");//crea el temporal de xml sin nombre ni na'a

$nuevo = $archivotema->createElement("tema");//crea el root del xml
$nuevo = $archivotema->appendChild($nuevo);//agrega el root al archivo temporal de xml
$nuevocomentario = $archivotema->createElement("comentario");//crea un contenedor para toda la información del comentario, usuario, nombre del tema y contenido
// Creo el atributo
$atributo = $archivotema->createAttribute("valor");
// Se lo acoplo al elemento "contactos"
$nuevocomentario->appendChild($atributo);
// Creo el texto
$atributo_valor = $archivotema->createTextNode("Principal");
// Se lo asigno al atributo
$atributo->appendChild($atributo_valor);
$nuevousuario = $archivotema->createElement("usuario", $usu);//crea el elemento usuario con su informacion
$nuevonombretema = $archivotema->createElement("nombretema", $nom);//crea el elemento nombretema con su informacion
$nuevocontenido = $archivotema->createElement("contenido");//crea el elemento contenido
$cdata = $archivotema->createCDATASection(utf8_encode($con));//crea una seccion de CDATA con su informacion, es decir, el contenido del tema
$nuevocontenido->appendChild($cdata);//agrega la seccion de CDATA al elemento "contenido"

//lo que sigue es el ensamble de los elementos principales
$nuevocomentario->appendChild($nuevousuario);//agrega el elemento ususario al elemento "comentario"
$nuevocomentario->appendChild($nuevonombretema);//agrega el elemento nombretema al elemento "comentario"
$nuevocomentario->appendChild($nuevocontenido);//agrega el elemento contenido al elemento "comentario"
$nuevo->appendChild($nuevocomentario);//agrega el elemento comentario al root del xml
$archivotema->save("temas/".$nom.".xml");//guarda el archivo creado con los cambios realizados

y el código para ver el tema creado y agregarle de quererlo, un comentario:

foreach($tema as $com){
$comentario = $com->getElementsByTagName("comentario");
if($comentario->item(0)->hasAttribute("valor")){
$nombreprincipal = $archivo->getElementsByTagName("nombretema");
$_SESSION["nombretema"] = $nombreprincipal->item(0)->nodeValue;
}
foreach($comentario as $ele){
$usuario = $ele->getElementsByTagName("usuario");
$nombretema = $ele->getElementsByTagName("nombretema");
$contenido = $ele->getElementsByTagName("contenido");
$utf8contenido = utf8_decode($contenido->item(0)->nodeValue);

echo "Usuario:<strong> ".$usuario->item(0)->nodeValue."</strong><br/><br/>";
echo "Nombre del Tema:<strong> ".$nombretema->item(0)->nodeValue."</strong><br/><br/>";
echo "Contenido:<br/>".$utf8contenido. "<br/><br/>";
}
}
if(isset($_SESSION["usuario"])){
?>
<form action="visualizartema.php" method="post">
Usuario:<br />
<?php echo $_SESSION["usuario"]; ?><br />
Comentario:<br />
<textarea name="contenido" style="resize:none; width:21em; height:10em">Escriba lo que desee aquí</textarea><br /><br />
<input type="submit" name="agregar" value="Agregar Comentario"/>
</form>

<?php
if(isset($_POST["agregar"])){
$usu=$_SESSION["usuario"];
$con=$_POST["contenido"];
$guardar="temas/".$_SESSION['archivovisualizar'];
/*no creo de nuevo el DOMdocument porque sino hace quilombo con el anterior, como son el mismo archivo...,
esto me plantea una duda, se puede cerrar el archivo que abrí antes o eso se hace solo cuando se cierra
el navegador???*/
$nuevocomentario=$archivo->createElement("comentario");
$nuevocontenido=$archivo->createElement("contenido");
$cdata=$archivo->createCDATASection(utf8_encode($con));
$nuevousuario=$archivo->createElement("usuario", $usu);
$nuevonombretema=$archivo->createElement("nombretema", "Respuesta: ".$_SESSION['nombretema']);

$cdata=$nuevocontenido->appendChild($cdata);
$nuevousuario=$nuevocomentario->appendChild($nuevousuario);
$nuevonombretema=$nuevocomentario->appendChild($nuevonombretema);
$nuevocontenido=$nuevocomentario->appendChild($nuevocontenido);
$nuevocomentario=$archivo->firstChild->appendChild($nuevocomentario);//el error esta aca, cómo hago para decirle que no se carge a su hermano y a su padre (porque tambien se carga el root "tema")???
$archivo->save($guardar);

unset ($_SESSION['nombretema']);

Muchas gracias gente!!! la verdad es que salió todo bárbaro!!! espero poder ayudar yo en un futuro. gracias de nuevo!
  #12 (permalink)  
Antiguo 12/05/2011, 15:49
Avatar de Ale_VH  
Fecha de Ingreso: abril-2011
Ubicación: Barcelona
Mensajes: 21
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: XML con CDATA en PHP no funciona!!!

por cierto, como sabés lo de que 0xE1 0x5D 0x5D 0x3E es "á]]>"???? donde se aprende eso??? porque la verdad es que gran parte del problema que se me planteó, fue que no entendía todos los numeritos y letras que aparecían en el mensaje de error, pero si hay una especie de manual, enciclopedia o lo que sea para aprender un poco, avisame asi me lo leo y sigo mejorando... salud!
  #13 (permalink)  
Antiguo 12/05/2011, 16:07
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años, 6 meses
Puntos: 1485
Respuesta: XML con CDATA en PHP no funciona!!!

lo primero, dominar el sistema hexadecimal. lo segundo, temas de los charset. y lo tercero, los distintos encoding que existe. el problema se presentaba entre utf-8 e iso-8859-1. en este caso, la secuencia no era utf-8 porque la secuencia de bytes de utf-8 usa un algoritmo especifico en los valores de los bytes.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:39.