Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/01/2012, 13:52
LhaN
 
Fecha de Ingreso: septiembre-2008
Mensajes: 148
Antigüedad: 15 años, 8 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.