PHP xpath: encuentre un elemento con un valor y también obtenga elementos antes y después del elemento

2 minutos de lectura

avatar de usuario
jpe

Digamos que tengo este XML:

<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 los elementos 1 antes y 1 después de ese elemento. Todo esto es para que pueda obtener los datos para una funcionalidad anterior/siguiente, así como para mostrar la imagen seleccionada en una página. Estaba pensando que esto lo haría:

$image_id = "003";
$project = $xml_object->xpath("photo[filename="$image_id"]");

Pero print_r es una matriz vacía… ¿Quizás hay una manera fácil con xpath de hacer esto? Pensé que podría hacerlo simplemente recorriendo y colocando los elementos anterior/siguiente 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.

EDITAR: resuelto: 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] 

Utilizar esta:

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

  • increíble, eso funciona. ¿Cómo obtendrías los elementos anterior y siguiente también?

    – jpea

    8 de junio de 2011 a las 13:40

  • $project = $xml_object->xpath("//photo"); while(list( , $node) = each($project)) { var_dump($node); } iteraría sobre todo el bucle.

    – Femi

    8 de junio de 2011 a las 13:46

  • lo siento, para aclarar: ¿cómo haría para obtener el elemento único antes y el elemento único directamente después, no todos los elementos de la foto?

    – jpea

    8 de junio de 2011 a las 13:49

  • no importa – lo tengo – //foto[filename=’$image_id’]/hermano-precedente::foto[1] para el anterior, //foto[filename=’$image_id’]/siguiente-hermano::foto[1] para el despues

    – jpea

    8 de junio de 2011 a las 14:02

  • Lindo. Habrá que recordar eso.

    – Femi

    8 de junio de 2011 a las 14:34

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad