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$flag_read_node = 0;
$flag_error = 0;
while($xml->read()) {
if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'Literal') {
$flag_read_node = 1;
while($flag_read_node) {
if($xml->read() === FALSE) {
//error de lectura
$flag_error = 1;
break;
}
switch($xml->nodeType) {
case XMLREADER::TEXT: {
$etiquetas['Literal'][] = $xml->value;
}
break;
case XMLREADER::END_ELEMENT: {
$flag_read_node = 0;
}
break;
}
}
}
}
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 originalcargalo_todo($xml, $etiquetas);
/*esto ya se que es cutre, pero funciona que no veas*/
echo "<pre>";
echo "</pre>";
/***/
function cargalo_todo(&$xml, &$lista) {
$flag_read_branch = 1;
while($flag_read_branch && $xml->read() !== FALSE) {
switch($xml->nodeType) {
case XMLREADER::END_ELEMENT: {
$flag_read_branch = 0;
}
break;
case XMLREADER::ELEMENT: {
if(!isset($lista[$xml->name])) { $lista[$xml->name] = array(); }
cargalo_todo($xml, $lista[$xml->name]);
}
break;
case XMLREADER::TEXT: {
$lista[] = $xml->value;
}
}
}
}
Saludos
vosk