用PHP搜索XML文件


Search XML file with PHP?

我有这个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
        )
)