我在xml节点上的xml循环中遇到了一个新问题,其中每组项目都包含在类别节点中,
我想做的是:
1-随机获取任意类别中的3个项目
2-获取每个所选项目的父项。
我的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;?>
非常感谢您的帮助和支持
答案 0 :(得分:1)
您只迭代第一个<category>
,它有两个<item>
个节点
为了实现你的成果,我建议......
xpath()
获取XML中所有 $items
个节点的数组<item>
。 $items
shuffle()
$items
数组并回显每个<item>
xpath()
获取<item>
的父级并回显其name
- 属性break
3次迭代后的循环示例代码:
$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
- 元素数组,这就是为什么每个$item
都可以被视为对象(echo $item->name;
)的原因。xpath()
可以再次用于检索父(..
)及其属性(../@name
);请注意@
属性。xpath()
返回一个数组,所以需要使用[0]
(第二echo
)取消引用。更新
在PHP&lt; 5.4你应该更新,如果不可能,请像这样取消引用:
$parents = $item->xpath('../@name');
echo $parents[0] . PHP_EOL;