我有这个XML文件getItems.php
:
<items>
<item name="Designer: X091" price="300">
<det set="10">
<data>
<![CDATA[
[{"c": 10092, "l": "", "hasItem": false}]
]]>
</data>
</det>
</item>
<item name="Designer: X091" price="10">
<det set="2">
<data>
<![CDATA[
[{"c": 19920, "l": "", "hasItem": false}]
]]>
</data>
</det>
</item>
</items>
我想做的是提取项目的名称和价格,以及det
的集合数,以及data
内部的变量,我想使用foreach
,这样我就可以获得每个项目,如果项目的名称是"Designer: X091"。
我正在尝试这个答案,但我有点混淆xpath
,希望得到一些帮助。谢谢:)
这里有一个使用SimpleXML搜索特定元素并显示其信息的工作示例。
我使用while
循环代替foreach
来停止搜索,当你找到你想要的元素。
<?php
$string = '
<items>
<item name="Designer: X091" price="300">
<det set="10">
<data>
<![CDATA[
[{"c": 10092, "l": "", "hasItem": false}]
]]>
</data>
</det>
</item>
<item name="Designer: X091" price="10">
<det set="2">
<data>
<![CDATA[
[{"c": 19920, "l": "", "hasItem": false}]
]]>
</data>
</det>
</item>
</items>';
$obj = new SimpleXMLElement($string);
$searchedName = 'Designer: X091';
$numberOfItems = count($obj->item);
$i = 0;
// While you don't find it and there're elements left, look for the next
while($obj->item[$i]['name'] != $searchedName && $i < $numberOfItems){
$i++;
}
// If the counter is NOT less than number of items, we didn't find it
if($i == $numberOfItems){
echo 'Item not found';
}
// Else, we know the position of the item in the object
else{
$price = $obj->item[$i]['price'];
$detSet = $obj->item[$i]->det['set'];
$data = $obj->item[$i]->det->data;
}
echo "Name: $searchedName<br>";
echo "Price: $price<br>";
echo "Det set: $detSet<br>";
echo "Data: $data<br>";
输出为:
<>之前名称:设计师:X091价格:300Det set: 10数据:[{"c": 10092, "l": ", "hasItem": false}]将XML设置为$xmlString
变量,然后:
// create a new instance of SimpleXMLElement
$xml = new SimpleXMLElement($xmlString);
$results = [];
// check how many elements are in your xml
if ($xml->count() > 0) {
// if more than 0, then create loop
foreach ($xml->children() as $xmlChild) {
// assign attributes to $attr variable
$attr = $xmlChild->attributes();
// check if your attrs are defined
if (isset($attr['name']) && isset($attr['price'])) {
// attach values to $results array
$results[] = [
'name' => (string)$attr['name'],
'price' => (int)$attr['price']
];
}
}
}
那么变量$results
应该看起来像:
Array
(
[0] => Array
(
[name] => Designer: X091
[price] => 300
)
[1] => Array
(
[name] => Designer: X091
[price] => 10
)
)