2016-03-29 55 views
1

我在XML有一個新的問題,對循環XML節點,其中每個項目組都包裹類節點PHP的循環, 我想要做的是:
1-隨機獲得任意類別的3個項目。
2-獲取每個選定項目的父項。計數項目 - XML的分類列表

我的XML樣本和PHP是在下面的EVAL或寫在下面: https://eval.in/544360

<?php 
$x = <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<List> 
<category name="cat1" dispName="First Category" catCode="FC1"> 
    <item itmCode="item1" show="true"> 
     <name>item 1</name> 
     <img>path to image 1</img> 
    </item> 
    <item itmCode="item2"> 
     <name>item 2</name> 
     <img>path to image 2</img> 
    </item> 
</category> 
<category name="cat2" dispName="Second Category" catCode="SC2"> 
    <item itmCode="item21"> 
     <name>item 21</name> 
     <img>path to image 21</img> 
    </item> 
    <item itmCode="item22"> 
     <name>item 22</name> 
     <img>path to image 22</img> 
    </item> 
    <item itmCode="item54"> 
     <name>item 54</name> 
     <img>path to image 54</img> 
    </item> 
    <item itmCode="item99"> 
     <name>item 99</name> 
     <img>path to image 99</img> 
    </item> 
</category> 
</List> 
XML; 

$xml = simplexml_load_string($x); // assume XML in $x 
$itemCount=0; 
foreach($xml->category->item as $item){ 
    $itemCount++; 
} 
echo $itemCount;?> 

非常感謝所有幫助和支持

+1

的可能的複製[顯示從XML在PHP中隨機元素](http://stackoverflow.com/questions/16780231/display-random-elements-from-xml-in-php) – michi

+0

該問題不僅僅是隨機選擇,而是它獲取所有可用類別的所有項目並隨機獲取來自提取項目列表的x個項目。 – Shror

回答

1

你迭代只有第一<category>,它有兩個<item>節點。
來實現自己的成果,我建議......

  • 使用xpath()獲取數組的$items所有<item>節點在XML。
  • 隨機
  • $itemsshuffle()
  • 迭代過$items陣列並再次呼應<item>
  • 使用xpath()得到<item>的父和後3次迭代
回聲其 name -attribute
  • break環路

    示例代碼:

    $xml = simplexml_load_string($x); // assume XML in $x 
    $items = $xml->xpath("/List/category/item"); 
    shuffle($items); 
    
    $count = 0; 
    foreach ($items as $item) { 
        echo $item->name . " from category "; 
        echo $item->xpath("../@name")[0] . PHP_EOL; 
    
        $count++; 
        if ($count >= 3) break;  
    } 
    

    看到它的行動:https://eval.in/545896

    評論:

    • xpath()返回SimpleXml -elements陣列,這就是爲什麼每一個$item可以作爲一個對象(echo $item->name;)進行處理。
    • xpath()可以再次用於檢索父代(..)及其屬性(../@name);注意@爲屬性。
    • 因爲xpath()返回一個數組,它需要與[0](第二個echo)取消引用。

    更新:

    在PHP < 5.4你應該更新了,如果這是不可能的,去參考這樣的:

    $parents = $item->xpath('../@name'); 
    echo $parents[0] . PHP_EOL; 
    
  • +0

    非常感謝你的詳細答案,因爲我在你提到的步驟中移動得非常順利,但在我的服務器上我得到了下面的解析錯誤:
    **解析錯誤:語法錯誤,意外的'[',expectcting' '或';'**
    這個問題是指在下面一行:'(
    'echo $ item-> xpath(「../@name」)[0]。PHP_EOL;' – Shror

    +0

    @ ShahirMorgan Php版本? – michi

    +0

    PHP版本5.2.17 – Shror