Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/12/2013, 09:40
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Leer informacion con la función XMLREADER

Pero si ya lo tienes, solo has de hacer otra vez la misma lectura dentro de la rama que encontraste bajo el nodo 'Literal':

Código PHP:
Ver original
  1. $etiquetas = array();
  2. $flag_read_node = 0;
  3. $flag_error = 0;
  4. while($xml->read()) {
  5.     if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'Literal') {
  6.         $flag_read_node = 1;
  7.         while($flag_read_node) {
  8.             if($xml->read() === FALSE) {
  9.                 //error de lectura
  10.                 $flag_error = 1;
  11.                 break;
  12.             }
  13.             switch($xml->nodeType) {
  14.                 case XMLREADER::TEXT: {
  15.                     $etiquetas['Literal'][] = $xml->value;
  16.                 }
  17.                 break;
  18.                 case XMLREADER::END_ELEMENT: {
  19.                     $flag_read_node = 0;
  20.                 }
  21.                 break;
  22.             }
  23.         }
  24.     }
  25. }

Esto te carga todas las ramas 'Literal'. El control del nodo END_ELEMENT es importante para evitar que te salte un error de lectura al terminar de leer la rama actual. Y de los nodos te quedas con el de texto TEXT que sería el contenido en la etiqueta.

Podrías ampliar un poco mas esta funcion y hacer que te vaya leyendo por capas, de forma que para cada capa creas una entrada en el array con el key del nombre del nodo, y como value un nuevo array donde cargarías todo lo siguiente; de esta forma te quedaría un array parecido al que obtienes en el simplexml; algo así:

Código PHP:
Ver original
  1. $etiquetas = array();
  2. cargalo_todo($xml, $etiquetas);
  3.  
  4. /*esto ya se que es cutre, pero funciona que no veas*/
  5. echo "<pre>";
  6. print_r($etiquetas);
  7. echo "</pre>";
  8. /***/
  9.  
  10. function cargalo_todo(&$xml, &$lista) {
  11.     $flag_read_branch = 1;
  12.     while($flag_read_branch && $xml->read() !== FALSE) {
  13.         switch($xml->nodeType) {
  14.             case XMLREADER::END_ELEMENT: {
  15.                 $flag_read_branch = 0;
  16.             }
  17.             break;
  18.             case XMLREADER::ELEMENT: {
  19.                 if(!isset($lista[$xml->name])) {
  20.                     $lista[$xml->name] = array();
  21.                 }
  22.                 cargalo_todo($xml, $lista[$xml->name]);
  23.             }
  24.             break;
  25.             case XMLREADER::TEXT: {
  26.                 $lista[] = $xml->value;
  27.             }
  28.         }
  29.     }
  30. }

Saludos
vosk