Фильтруйте php simple_xml результаты загрузки с помощью xpath - PullRequest
0 голосов
/ 25 июня 2018

Мне нужна небольшая помощь, чтобы разобраться в поиске XPath внутри вывода XML simple_xml_load в PHP. У меня есть этот XML:

<PRODUCTS>
  <PRODUCT>
    <CODE>5009444</CODE>
    <NAME>Prova</NAME>
    <IMG>prova.jpg</IMG>
  </PRODUCT>
  ....
  ....
</PRODUCTS>

Я хочу отфильтровать и перебрать эти данные, чтобы найти и вернуть все вхождения с помощью кода переменной. Я использовал этот синтаксис, но не работал

$id = 1;
$struct = \App\Models\Structures::where('id', $id)->first();
$url = 'http://demo.villaggissimi.it/public/xml/CMP_' . $struct->operators->pk .'.xml';
$xc = simplexml_load_file($url) or die("Non sono stati trovati risultati");
$xml2 = $xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code']");
return response()->json($xml2);

1 Ответ

0 голосов
/ 25 июня 2018

Результатом выражения Xpath является список узлов, SimpleXMLElement: xpath () поддерживает только такой результат, он всегда будет возвращать массив объектов SimpleXMLElement (для действительного выражения Xpath).

Таким образом, вы все равно должны использовать foreach()/if(), чтобы избежать сообщения об ошибке, если элемент не был найден.

Однако вы можете ограничить результат только списком с одним узлом.

foreach ($xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code'][1]") as $productNode) {
  return response()->json($productNode);
}
return FALSE;

$productNodes = $xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code'][1]");
if (count($productNodes) > 0) {
  return response()->json($productNodes[0]);
}
return FALSE;
...