Допустим, у меня есть этот 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>
И я хочу найти элемент с именем файла 003, а затем найти элементы 1 до и 1 после этого элемента. Это все, поэтому я могу получить данные для предыдущей / следующей функциональности, а также показать выбранное изображение на странице. Я думал, что это сделает это:
$image_id = "003"; $project = $xml_object->xpath("photo[filename='$image_id']");
Но это print_r – пустой массив … Есть ли простой способ с xpath сделать это, возможно? Я подумал, что могу сделать это, просто перейдя в цикл и поместив предыдущие / последующие элементы в массив temp, затем, как только он будет найден, перерыв цикла и возвращение данных temp, но я думал, что xpath может сделать это немного больше элегантно.
EDIT: разрешено – вот более четкий ответ для узлов-братьев:
// for the one prior //photo[filename='$image_id']/preceding-sibling::photo[1] // for the one after //photo[filename='$image_id']/following-sibling::photo[1]
Использовать это:
$project = $xml_object->xpath("//photo[filename='$image_id']");