Ver Mensaje Individual
  #3 (permalink)  
Antiguo 05/03/2012, 04:30
jjreina
 
Fecha de Ingreso: marzo-2010
Mensajes: 13
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: warning al leer xml

Gracias por contentar, aquí dejo el código de la función es un poco largo lo siento por eso no lo había puesto

Código PHP:
function getXMLData($xmlText$isMultivalue true) {

    
// Variables auxiliares para la lectura del xml
    
$entries 0;               // Numero de objetos devueltos por la busqueda + 1 fila de la cabecera
    
$data = array();            // Array de datos utiles del xml devuelto por la busqueda + 1 fila de la cabecera
    
$data[$entries] = array();  // Primer subarray con los nombres de los campos de tarsys de la plantilla (cabecera)


    // Se recoge el xml que nos interesa sin la envoltura SOAP
    
$reader = new XMLReader();
    
$reader->xml($xmlTextNULLLIBXML_NOWARNING LIBXML_NOERROR);
    while(
$reader->read()) 
    {
        if(
$reader->nodeType == XMLReader::ELEMENT && $reader->localName == "result"
        {
             
$reader->read();
             
$xmlSinSoap trim($reader->value);
        }
    }
    
$reader->close();

    
$xmlresult $xmlSinSoap;

    
// Obtenemos el array con los campos del template para $data[0]
    
$p xml_parser_create();
    
xml_parse_into_struct($p$xmlresult$vals$index);
    
xml_parser_free($p);

    for(
$i 0$i count($index['NS1:FIELD']); $i++) 
    {
      
$fieldindex $index['NS1:FIELD'][$i];
      if ((
$vals[$fieldindex]['type']=="open") || ($vals[$fieldindex]['type']=="complete")) 
      {
        
$data[0][$vals[$fieldindex]["attributes"]['POSITION']]=$vals[$fieldindex]["attributes"]['NAMETARSYS'];
      }
    }
    
$totalCampos=count($data[0]);
    
$reader2 = new XMLReader();
    
// AQUI ES DONDE SE PRODUCE EL WARNING
    
$reader2->xml($xmlresultNULLLIBXML_NOWARNING LIBXML_NOERROR);
    if(
$isMultivalue && isset($data[0][4]) && $data[0][4]=="Votantes-IdVoto")
    {
      
$domNodos = array();
      
$domNodosIndex 0;
      
$N 0;   // Número de ids del multivalor con más valores de id distintos

      
while ($reader2->read() && !($reader2->nodeType == XMLReader::END_ELEMENT && $reader2->localName == "entry")) 
      {
        if(
$reader2->nodeType == XMLReader::ELEMENT
        {
            if(
$reader2->localName == "column"
            {
                
$pos $reader2->getAttribute("position");
                
$domNodos[++$domNodosIndex] = $reader2->expand()->childNodes->length;
            }
        }
      }

      if(
count($domNodos) > 0
      {
        
$N max($domNodos);
        for(
$i 1$i <= $N$i++) 
        {
          
$data[$i] = array();
          for(
$j 1$j< = count($data[0]); $j++) 
          {
            
$data[$i][$j]=""//Inicializamos la tabla completa de multivalue
          
}
        }

        
$indexInDataForId=array(); //Asociamos el indice de $data con cada id
        
$nextIndex=1//Siguiente indice a crear en indexInDataForId para id nuevo
        
$pos=0//Current position for each data of the multivalue
        
$currentId=0//Current ID for each data of the multivalue
        
$currentValue=0//Current value for that ID
        
$voto=array(); //Tabla para guardar los datos de los votos
        
$indexInVotoForId=array();
        
$nextIndexInVoto=1;

        
$reader2->close();
        
$reader2 = new XMLReader();
        
$reader2->xml($xmlresultNULLLIBXML_NOWARNING LIBXML_NOERROR);
        while (
$reader2->read() && !($reader2->nodeType == XMLReader::END_ELEMENT && $reader2->localName == "entry")) {
          if (
$reader2->nodeType == XMLReader::ELEMENT) {
            
// Se recoge la position de los valores a partir de ahora
            
if ($reader2->localName=="column") {
              
$pos=$reader2->getAttribute("position");

            
// Se guarda el valor correspondiente (identificando el indice en $data)
            
} else if($reader2->localName=="id") {

              
$reader2->read();
              
$currentId=trim($reader2->value);

            }
        }

        
$totalVotantes count($data)-1;   
        
$reader2->close();

He puesto un comentario en mayúsculas donde se produce el warning.

Sobre todo el problema que tengo es que como aun no he conseguido reproducir el warning de forma sistemática no se por donde puede venir, ya que como comento solo da el warning en poquísimas situaciones y de momento no he sacado ningún patrón.

Muchas gracias.

Última edición por jjreina; 05/03/2012 a las 04:47