簡體   English   中英

PHP SimpleXML XPath獲取下一個父節點

[英]PHP SimpleXML XPath get next parent node

我以前從來沒有在這里問過一個問題所以請原諒我的問題,如果它的格式很糟糕或不夠具體。 我只是一個討厭的人,對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的'item'的額外細節:

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

所以來自www.mysite.com/file.php?reference=A1這樣的網址

我會得到這個HTML:

<p>My title1</p>

我意識到我可能沒有做到這一點,任何改進這一點的指示都是受歡迎的。

我的問題是,我想找到下一個和之前的'項目'細節。 如果我從URL知道引用= A1,我如何找到下一個“項目”的引用,標題等? 如果我只有'A1'並且我知道這是一個參考節點,我該如何得到這樣的HTML:

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

我讀過關於兄弟姐妹但我不知道如何使用它。 我只能找到參考節點的以下兄弟,這不是我需要的。

任何幫助贊賞。

你可以使用:

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

含義: catalogue根元素的item元素子元素,具有帶有'A1'字符串值的reference元素,navegate到第一個跟隨sibling item元素的title子元素。

我可能會使用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語法文檔的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM