Foros del Web » Programando para Internet » PHP »

Leer informacion con la función XMLREADER

Estas en el tema de Leer informacion con la función XMLREADER en el foro de PHP en Foros del Web. Buenas a todos veran, apenas ayer empece a trabajar con la función xmlreader ya que surge la necesidad de manejar ficheros xml de hasta 600mb ...
  #1 (permalink)  
Antiguo 07/12/2013, 17:00
 
Fecha de Ingreso: noviembre-2011
Ubicación: Cartago
Mensajes: 39
Antigüedad: 12 años, 3 meses
Puntos: 0
Leer informacion con la función XMLREADER

Buenas a todos veran, apenas ayer empece a trabajar con la función xmlreader ya que surge la necesidad de manejar ficheros xml de hasta 600mb y en ellos hay algunas etiquetas repetidas pero necesito solo obtener la primera, he visto que con la funcion simplexml_load() se puede obtener el valor de la 1er columna algo como esto
Cita:
$xml = simplexml_loadfile("archivo.xml");
$xml -> photo[0]['name'];
//y eso devuelve el primer valor que esta en la etiqueta photo dentro de name
Pero yo necesito eso mismo pero utilizando XMLREADER
mi codigo
Cita:
<?php
$xml = new XMLREADER();
$xml -> open("DIFF_20131202.xml");
$etiquetas = array();
while($xml -> read())
{
//Obtener titulo del libro
if($xml ->nodeType == XMLREADER::ELEMENT && $xml->localName == 'Literal')
{
$xml ->read();
$etiquetas['Literal|'] = $xml->value;
}
}
?>
Algo asi esta estructurado mi XML
Cita:
<?xml version="1.0" encoding="utf-8" ?>
<eBooks>
<BISAC>
<Literal>EDUCATION</Literal>
</BISAC>
<BISAC>
<Literal>General</Literal>
</BISAC>
</eBooks>
Espero que puedan ayudarme gracias
  #2 (permalink)  
Antiguo 08/12/2013, 09:40
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 7 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

Etiquetas: etiquetas, lectura, php5, xml
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 03:00.