Digamos que tengo este XML:PHP - Buscar elemento con un valor y también obtener los elementos antes y después del elemento
<images>
<photo>
<thumbImg>images/thumbs/002.jpg</thumbImg>
<filename>002</filename>
</photo>
<photo>
<thumbImg>images/thumbs/008.jpg</thumbImg>
<filename>008</filename>
</photo>
<photo>
<thumbImg>images/thumbs/003.jpg</thumbImg>
<filename>003</filename>
</photo>
<photo>
<thumbImg>images/thumbs/006.jpg</thumbImg>
<filename>006</filename>
</photo>
<photo>
<thumbImg>images/thumbs/005.jpg</thumbImg>
<filename>005</filename>
</photo>
</images>
Y quiero encontrar el elemento con el valor de nombre de archivo de 003 y luego encontrar el elementos 1 antes y 1 después de ese elemento. Esto es todo, así puedo obtener los datos para una funcionalidad anterior/siguiente y mostrar la imagen seleccionada en una página. Estaba pensando que esto haría que:
$image_id = "003";
$project = $xml_object->xpath("photo[filename='$image_id']");
Pero print_r de una matriz vacía ... ¿Hay una manera fácil con XPath para hacer esto, tal vez? Pensé que podría hacerlo simplemente haciendo un looping y colocando los elementos previos/siguientes en una matriz temporal, luego, una vez que se encuentra, rompa el ciclo y devuelva los datos temporales, pero pensé que xpath podría hacerlo un poco más esmeradamente.
EDIT: solucionado - aquí está la respuesta más clara para los nodos hermanos:
// for the one prior
//photo[filename='$image_id']/preceding-sibling::photo[1]
// for the one after
//photo[filename='$image_id']/following-sibling::photo[1]
impresionante, que funciona - ¿cómo obtener los elementos anterior y siguiente también? – jpea
'$ project = $ xml_object-> xpath (" // photo "); while (list (, $ node) = each ($ project)) { var_dump ($ node); } 'iteraría en todo el ciclo. – Femi
lo siento, para aclarar: ¿cómo podría obtener el elemento individual anterior y el elemento individual directamente después, no todos los elementos de la foto – jpea