Foros del Web » Programando para Internet » PHP »

Un pequeño desafio con simplexml_load_string

Estas en el tema de Un pequeño desafio con simplexml_load_string en el foro de PHP en Foros del Web. Buenas gentes, no los quiero engañar con el titulo, pero no se como titular este problemita que estoy teniendo. Estube buscando info y no hay ...
  #1 (permalink)  
Antiguo 07/01/2012, 13:52
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Busqueda Un pequeño desafio con simplexml_load_string

Buenas gentes, no los quiero engañar con el titulo, pero no se como titular este problemita que estoy teniendo. Estube buscando info y no hay gran cosa sobre el tema. Quizas a alguien se le ocurra alguna idea por que la verdad no parece tener solucion.

El tema es asi, hace tiempo vengo trabajando en un proyecto personal, convertir html en xml, procesarlo al xml y luego volverlo a convertir en html.

Entonces en php yo tengo una funcion que trabaja con simplexml_load_string y lo que hace es convertirme el html a xml. Luego con otra funcion recorro los elementos del xml y los meto a una variable.

La funcion de xml a html es la siguiente:
Código PHP:
Ver original
  1. public static function xml2html($element){
  2.     $tempHtml='<'.$element->getName();
  3.     foreach($element->attributes() as $att => $value) {
  4.         $tempHtml=$tempHtml.' '.$att.'="'.$value.'"';
  5.     }
  6.  
  7.  
  8.     $children=$element->children();
  9.     //Si no tiene hijos
  10.     if($children==null)
  11.         //Se cierra el elemento inmediatamente y salta de linea
  12.         $tempHtml=$tempHtml."/>";
  13.     else{//Si tiene hijos
  14.         //Si tiene contenido el elemento
  15.         if($element!="")
  16.             //Cierra el tag del elemento y muestra el contenido
  17.             $tempHtml=$tempHtml.">".$element;
  18.         else
  19.             //Cierra el tag del elemento y salta de linea
  20.             $tempHtml=$tempHtml.">";
  21.         foreach($children as $child)
  22.             $tempHtml=$tempHtml.self::xml2html($child);
  23.         $tempHtml=$tempHtml."</".$element->getName().">";
  24.     }
  25.     return $tempHtml;
  26. }

Finalmente tengo el script de pruebas:
Código PHP:
Ver original
  1. <?
  2. $var='<!DOCTYPE><html><title>Hola mundo!</title><body><p>Esta <i>es</i> una <b>prueba!</b></p><br/><input type="text" value="Algo"/></body></html>';
  3. $xml=xmlFunctions::html2xml($var);
  4. $html=xmlFunctions::xml2html($xml);
  5. echo $html;
  6. ?>

El problema es el siguiente, al realizar este parseo de html a xml y de vuelta a html el resultado obtenido es:
<html><title>Hola mundo!</title><body><p>Esta una <i>es</i><b>prueba!</b></p><br></br><input type="text" value="Algo"></input></body></html>
Contra lo que yo mande como html que es:
<html><title>Hola mundo!</title><body><p>Esta <i>es</i> una <b>prueba!</b></p><br/><input type="text" value="Algo"/></body></html>

No presten atencion a la falta del DOCTYPE.

Noten el orden en que quedaron las cosas dentro del parrafo.

Esto se debe a que en el codigo primero se pone el contenido del elemento p, que es "Esta una" y luego los hijos que son i y b.

En fin, alguien tiene alguna sugerencia de como resolver esto?

Gracias desde ya.
  #2 (permalink)  
Antiguo 08/01/2012, 02:57
 
Fecha de Ingreso: octubre-2004
Ubicación: Barcelona
Mensajes: 195
Antigüedad: 19 años, 6 meses
Puntos: 7
Respuesta: Un pequeño desafio con simplexml_load_string

Lo que yo haría es poner un nuevo nivel al árbol XML para los nodos que son sólo texto para poder hacer el paso a la inversa como quieres hacer. Algo como esto.

Código HTML:
<p>
    <text>Esta </text>
    <i>es</i>
    <text> una </text> 
    <b>prueba!</b>
</p> 
  #3 (permalink)  
Antiguo 08/01/2012, 13:30
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 7 meses
Puntos: 10
Respuesta: Un pequeño desafio con simplexml_load_string

Ya lo resolvi, por si alguien se enfrenta a este problema algunas vez, basta decir que es una de las principales diferencias entre simpleXML y DOMDocument. No queda otra que recorrer los nodos via DOMDocument, ya que detecta este tipo de situaciones. Por algo sera que es mas complejo de usar.

Etiquetas: html, variables
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:07.