【问题标题】:PHP SimpleXML XPath get next parent nodePHP SimpleXML XPath 获取下一个父节点
【发布时间】:2010-09-02 12:16:56
【问题描述】:

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

我已阅读过关于追随兄弟的信息,但我不知道如何使用它。我只能找到引用节点的以下兄弟,这不是我需要的。

任何帮助表示赞赏。

【问题讨论】:

    标签: php xpath simplexml parent siblings


    【解决方案1】:

    你可以使用:

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

    含义:来自catalogue 根元素的item 元素子元素,具有带有'A1' 字符串值的reference 元素,导航到第一个后续兄弟item 元素的title 子元素。

    【讨论】:

    • @Hayley Easton:我很高兴它有帮助。
    【解决方案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 syntax 的文档。

    【讨论】:

    • 感谢您的回答,这对我有用,但我最终使用了第一个响应。我发现您的解决方案同样有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2015-10-23
    • 2015-03-30
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多