PHP SimpleXML XPath получить следующий родительский узел - PullRequest
3 голосов
/ 02 сентября 2010

Я никогда раньше не задавал вопрос здесь, поэтому, пожалуйста, прости мой вопрос, если он отформатирован плохо или недостаточно конкретен.Я просто любитель и очень мало знаю о PHP и XPath.

У меня есть такой XML-файл:

<catalogue>
 <item>
  <reference>A1</reference>
  <title>My title1</title>
 </item>
 <item>
  <reference>A2</reference>
  <title>My title2</title>
 </item>
</catalogue>

Я вытягиваю этот файл, используя SimpleXML:

$file = "products.xml";
$xml = simplexml_load_file($file) or die ("Unable to load XML file!");

Затем я использую ссылку из параметра URL, чтобы получить дополнительную информацию о «элементе» с помощью PHP:

foreach ($xml->item as $item) {
if ($item->reference == $_GET['reference']) {
 echo '<p>' . $item->title . '</p>';
}

Так что с URL, например, www.mysite.com/file.php?reference = A1

Я бы получил этот HTML:

<p>My title1</p>

Я понимаю, что, возможно, я не делаю это правильно, и любые указания по улучшению этого приветствуются.

Мой вопросЯ хочу найти следующую и предыдущую информацию о товаре.Если по URL-адресу я знаю, что ссылка = A1, как мне найти ссылку, заголовок и т. Д. Следующего «элемента»?Если у меня есть только «А1» и я знаю, что это ссылочный узел, как мне получить HTML, например, так:

<p>Next item is My title2</p>

Я читал о том, как подписаться на одного брата, но я не знаю, как его использовать.Я могу найти только одного и того же эталонного узла, который мне не нужен.

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 02 сентября 2010

Вы можете использовать:

/catalogue/item[reference='A1']/following-sibling::item[1]/title

Значение: от дочернего элемента item корневого элемента catalogue, имеющего элемент reference со строковым значением 'A1', переходя к первому после дочернего элемента item элемента title child. 1010 *

2 голосов
/ 02 сентября 2010

Я бы, вероятно, использовал xpath для получения следующего / предыдущего (и текущего) узла.

<?php

error_reporting(E_ALL ^ E_NOTICE);

$s = '
<catalogue>
 <item>
  <reference>A1</reference>
  <title>My title1</title>
 </item>
 <item>
  <reference>A2</reference>
  <title>My title2</title>
 </item>
 <item>
  <reference>A3</reference>
  <title>My title3</title>
 </item>
</catalogue>
';

$xml = simplexml_load_string($s);
$reference = 'A3';

list($current) = $xml->xpath('/catalogue/item[reference="' . $reference . '"]');

if($current) {
    print 'current: ' . $current->title . '<br />';

    list($prev) = $current->xpath('preceding-sibling::*[1]');

    if($prev) {
        print 'prev: ' . $prev->title . '<br />';   
    }

    list($next) = $current->xpath('following-sibling::*[1]');

    if($next) {
        print 'next: ' . $next->title . '<br />';   
    }
}

См. Документацию SimpleXMLElement::xpath и Синтаксис XPath Документация.

...