Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

XML Parser en PHP5

Estas en el tema de XML Parser en PHP5 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos!! ¿Sabéis si hay algún tipo de incompatibilidad con el XML Parser que utiliza la versión de php4 y la de php5? Trato ...
  #1 (permalink)  
Antiguo 16/07/2008, 09:00
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
XML Parser en PHP5

Hola a todos!!

¿Sabéis si hay algún tipo de incompatibilidad con el XML Parser que utiliza la versión de php4 y la de php5?

Trato xmls que con php4 me van bien pero en php5 no.

Si es así, ¿que otra opción me recomendáis para tratar xmls?

Gracias.
__________________
Perdida en el mundo del conocimiento
  #2 (permalink)  
Antiguo 16/07/2008, 09:09
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: XML Parser en PHP5

¿Mensaje de error?
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 16/07/2008, 09:19
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola enriqueplace,

No me da ningún mensaje de error, lo que pasa es que no me ejecuta bien la función definidas en xml_set_default_handler ni me trata bien los datos.

El hecho está en que la función que se ejecuta por defecto no me lee los <![CDATA[ cuando en la versión de php4 si.

He posteado de manera más detallada mi problema en el foro de xml, pero una vez hecho he pensado que debería haberla puesto en este foro pero no se moverla :(
__________________
Perdida en el mundo del conocimiento
  #4 (permalink)  
Antiguo 16/07/2008, 09:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: XML Parser en PHP5

Hola SUSMO,

Te recomiendo usar mejor SimpleXML, es mas sencillo que usar el viejo parser.

Saludos.
  #5 (permalink)  
Antiguo 16/07/2008, 09:40
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola GatorV,

Ya me lo he planteado pero soy novata en el tratamiento de xml y no se como empezar, el código ya estaba implementado y tengo que migrarlo a php5, ha sido entonces cuando he tenido problemas.

¿Podrías orientarme como puedo hacer la equivalencia de este constructor a SimpleXML?
He estado mirando mucha documentación pero no hay manera de que me aclare

Constructor de la clase XML_Tree:
Código PHP:
function XML_Tree($sFile
{
    
$sFileCont join(file($sFile), "");

    
$rPar xml_parser_create("UTF-8");
    
xml_parser_set_option($rParXML_OPTION_CASE_FOLDING0);
    
xml_parser_set_option($rPar,XML_OPTION_TARGET_ENCODING"UTF-8");
        
    
xml_set_object($rPar$this);
        
    
xml_set_element_handler($rPar"_startElementHand""_endElementHand");
    
xml_set_character_data_handler($rPar"_CDataHand");
    
xml_set_default_handler($rPar"_defaultHand");
        
    
xml_parse($rPar$sFileConttrue)
            or 
user_error(xml_error_string(xml_get_error_code($rPar)). ' line:' xml_get_current_line_number($rPar) . ' column:' xml_get_current_column_number($rPar) . "<br />The file $sFile has invalid syntax"E_USER_WARNING);

¡¡Gracias por la ayuda!!
__________________
Perdida en el mundo del conocimiento
  #6 (permalink)  
Antiguo 17/07/2008, 10:03
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola a todos,

He hecho la equivalencia del constructor indicado en el post anterior hecho con XML Parser en PHP4 a simpleXML de PHP5 y aquí os pongo el código por si os pudiera servir de ayuda.

Código PHP:
function XML_Tree($sFile
{
    
$sxe = new SimpleXMLElement($sFileNULLTRUE);
        
    if (!
$sxe)
        
user_error("Error open XML file"E_USER_ERROR);
    else
        
$this->parseXML($sxe); 
}

function 
parseXML($sxe)
{
    
//Función que recibe cada elemento del XML y lo trata
        
    //Datos del nodo actual
    
$name $sxe->getName();
    
$attribs $sxe->attributes();

    
//Conversión de los atributos del nodo a un array. 
    //Se necesita para la función  _startElementHand 
    
$array_attribs = array();
    foreach (
$attribs as $key => $val 
    {
        
$array_attribs[$key] = (string)$val;
     }

     
$this->_startElementHand ($name$array_attribs);

      
//si el hijo no tiene array significa que tiene datos (información del nodo)
      
if (count($sxe) == 0)
      {    
            
$data $sxe[0];
  
            
//Error. No me lee si la información del nodo tiene CDATA
            
if (strstr($data,"<![CDATA["))
                echo 
"he encontrado el data ".$data;

            
$this->_CDataHand($data);
            
$this->_defaultHand($data);
        }
        
        
//Recursividad por cada hijo del nodo
    
foreach ($sxe->children() as $child)
        {
           
$this->parseXML($child);    
        }

        
$this->_endElementHand($name);   

Por lo que he testeado hasta ahora me funciona bien. Sólo hay un problemilla y es necesito saber que nodo tiene CDATA para tratarlo de una manera u otra y de la manera que lo he implementado no me funciona.

¿Alguien sabe como puedo mirarlo? ¿Tengo que descodificar de alguna forma el $data?
__________________
Perdida en el mundo del conocimiento
  #7 (permalink)  
Antiguo 17/07/2008, 13:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: XML Parser en PHP5

Hola SUSMO,

A mi parecer creo SimpleXML no te regresa el nodo con todo y el <![CDATA[, es decir cuando tu llamas al elemento si tiene CDATA te regresa el contenido directamente.

Saludos.
  #8 (permalink)  
Antiguo 18/07/2008, 01:40
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola GatorV,

¿Entonces no hay ninguna manera de saber si el nodo contiene CDATA?
¿Y saber si el contenido del nodo tiene código HTML?
Otro problema que tengo es que al mostrar la información en la pantalla no me ejecuta el código HTML sino que me lo muestra con los tags, es decir, algo como :

<div> hola </div> me lo muestra tal cual.

¿Como puedo solucionarlo?
__________________
Perdida en el mundo del conocimiento
  #9 (permalink)  
Antiguo 18/07/2008, 01:50
 
Fecha de Ingreso: mayo-2005
Mensajes: 188
Antigüedad: 19 años
Puntos: 6
Respuesta: XML Parser en PHP5

Volviendo a la primera pregunta, mírate esto: http://alexandre.alapetite.net/doc-a...xml-php4-php5/

Las APIs DOM de PHP4 y PHP5 son diferentes, con lo que el código de PHP4 no te funcionará en PHP5. En el enlace anterior te puedes descargar un fichero que "traduce" la API del 4 al 5, con lo que podrás utilizar tu código en PHP5.

De todas maneras, esta solución debería ser sólo mientras realizas la nueva implementación, ya sea con el DOM de PHP5 o con SimpleXML.

Saludos

Ups, no me había leído los posts anteriores. Entiendo que utilizas el parser SAX y no el DOM. De todas maneras dejo el enlace por si te sirve

Última edición por juanfuentes; 18/07/2008 a las 01:52 Razón: No era DOM
  #10 (permalink)  
Antiguo 18/07/2008, 02:04
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Muchas gracias juanfuentes,

Aunque ya he implementado el código para simpleXML me lo miraré a ver si salgo de dudas del error.

¿Sabes si existe lo mismo pero para XML Parser en lugar de para DOM?
__________________
Perdida en el mundo del conocimiento
  #11 (permalink)  
Antiguo 18/07/2008, 09:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: XML Parser en PHP5

Lo que pasa es que CDATA es obligatorio creo para los nodos que contienen texto para evitar mal formaciones en el XML, por lo que automaticamente los quita y te devuelve el texto del nodo.

Para mostrar el HTML (o "ejecutarlo" como dices), puedes usar html_entity_decode.

Saludos.
  #12 (permalink)  
Antiguo 18/07/2008, 09:47
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

El problema es que necesito saber que elementos del xml contienen el cdata ya que recojo la información, la puedo modificar y luego vuelvo a guardarla en el archivo xml.
Como esta información puede que tenga código html aunque no es obligatório, si no guardo los datos que tenían el cdata con cdata al volver a recuperarlos me peta la aplicación.

Se me ha ocurrido la idea (tal vez chapucilla y lenta pero no se me ocurre otra) de leer el archivo xml para buscar si el elemento que estoy tratando tiene cdata o no.
He estado buscando alguna instrucción de php que me busque dentro de un archivo una cadena pero no la he encontrado así que he optado por leer línea a línea el fichero para buscar si la información que trato en ese momento tiene el cdata.

Pondría el código que he implementado pero ahora mismo no tengo acceso a él :(
Así que, abro el fichero con el fopen, lo recorro con fgets y con la función strpos busco la línea que me intersa para buscar en ella la cadena "<![CDATA["

El strpos no me encuentra la cadena y a mi modo de ver es problema de la codificación. El xml está codificado con UTF-8 y al buscar la información dentro de cada línea del fichero no me la encuentra ya que según he leído la instrucción de búsqueda trata el fichero con codificación binária. La verdad es que no tengo muy claro el tema de codificación de carácteres y no se como puedo cambiar la codificación de la información extraída del xml para que me la compare con la misma codificación de cuando abro el fichero.

¿Me serviria también html_entity_decode? ¿Qué codificación debo ponerle?
__________________
Perdida en el mundo del conocimiento
  #13 (permalink)  
Antiguo 19/07/2008, 11:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: XML Parser en PHP5

Mmm pero creo no estas leyendo mi punto, CDATA es obligatorio para todos los nodos de texto, por eso no importa si sabes o no, si es nodo de texto debes de agregarlo entre CDATA para evitar mal formaciones de XML.

Saludos.
  #14 (permalink)  
Antiguo 21/07/2008, 02:43
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola GatorV,

Si he que leído tu punto pero por lo que también he leído por ahí el CDATA es obligatorio siempre y cuando en la información pongas código que pueda ser interpretado por el XML como por ejemplo código html, javascript que tiene tags y "signos" tales como "<>" y al leer el XML se hace un lío, es entonces cuando se debe poner CDATA para que estos signos no se interpreten y produzcan errores.

Mis xml se crean de forma automática y la primera vez que se crea un elemento controlo y se exactamente cuando voy a poner código html es entonces cuando pongo el elemento con CDATA.
El problema viene cuando el elemento ya está creado que es entonces cuando necesito saber si el nodo tenía CDATA o no para volver a ponérselo cuando guardo otra vez el XML.

Saludos!!
__________________
Perdida en el mundo del conocimiento
  #15 (permalink)  
Antiguo 21/07/2008, 09:44
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: XML Parser en PHP5

Hola a todos!!

Bueno, al fin he acabado la función que comprueba si la información de un elemento de un archivo XML tiene CDATA o no.

Seguramente, haya otra manera más fácil, menos rebuscada y más óptima de comprobarlo pero, después de luchar días con ello el resultado ha sido el que os muestro.
Aquí os la dejo para quien pueda interesarle:

Código PHP:
function _defaultHand ($data
{
        
//$this->file es la url del archivo XML
        
$gestor fopen($this->file"r");
        if (
$gestor
        {
            
$parar false;
            while (!
feof($gestor) && !$parar
            {
                
$bufer fgets($gestor4096);

                
//Si es una línea en blanco. >1 pq el espacio en blanco lo cuenta
                
if (strlen($bufer) > 1)
                {
                    
//Busco las líneas del xml que tengan CDATA
                    
$pos strrpos($bufer,"<![CDATA[");
                    if (
$pos !== false)
                    {
                        
//Información del buffer sin el cdata
                        
$pos_ini = (int) $pos+9//<![CDATA[ = 9 carácteres
                        
$pos_fin strrpos($bufer,"]]>");
                        
$long $pos_fin-$pos_ini;
                        
$info_bufer substr($bufer,$pos_ini$long);

                        
//Comparación de información
                        
if (strcmp(trim($info_bufer),trim($data)) == 0)
                        {
                                     
$parar true;
                                     
//Aquí va el código que se ejecuta en el caso de encontrar un CDATA en la información
                        
}
                    }
                } 
            }
            
fclose ($gestor);
        }

__________________
Perdida en el mundo del conocimiento
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




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