3

我以前从未在这里问过问题,所以如果它的格式不好或不够具体,请原谅我的问题。我只是一个涉足者,对 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>';
}

所以从像 www.mysite.com/file.php?reference=A1 这样的 URL

我会得到这个 HTML:

<p>My title1</p>

我意识到我可能做的不对,欢迎任何改进这一点的指针。

我的问题是,我想找到下一个和上一个“项目”的详细信息。如果我从 URL 中知道 reference=A1,我如何找到下一个“项目”的参考、标题等?如果我只有 'A1' 并且我知道这是一个参考节点,我如何获得这样的 HTML:

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

我已经阅读过关于following-sibling,但我不知道如何使用它。我只能找到参考节点的以下兄弟,这不是我需要的。

任何帮助表示赞赏。

4

2 回答 2

3

你可以使用:

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

含义:从根元素的item元素子元素,具有'A1'字符串值的元素,导航到第一个跟随兄弟元素的子元素。cataloguereferenceitemtitle

于 2010-09-02T12:48:00.500 回答
2

我可能会使用 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::xpathXPath 语法文档。

于 2010-09-02T12:49:17.200 回答