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($xmlText, NULL, LIBXML_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($xmlresult, NULL, LIBXML_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($xmlresult, NULL, LIBXML_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.