2011-06-08 18 views
6

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] 

Respuesta

7

Utilice esta:

$project = $xml_object->xpath("//photo[filename='$image_id']"); 
+0

impresionante, que funciona - ¿cómo obtener los elementos anterior y siguiente también? – jpea

+1

'$ project = $ xml_object-> xpath (" // photo "); while (list (, $ node) = each ($ project)) { var_dump ($ node); } 'iteraría en todo el ciclo. – Femi

+0

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

Cuestiones relacionadas