Фильтрация результатов загрузки php simple_xml с помощью xpath

Мне нужна небольшая помощь, чтобы разобраться в поиске 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);

Найти все вхождения чего именно?

Jerodev 25.06.2018 17:08

мне нужно перебрать результаты корыто, которые имеют такое же значение «КОДА». Но я не хочу использовать оператор foreach и if, а напрямую xpath

wwhitewalter 25.06.2018 17:10

CODE - это имя узла, а не атрибут, поэтому ваш XPath неверен, поскольку он обрабатывает его как атрибут.

Patrick Mevzek 25.06.2018 17:38

@PatrickMevzek, если бы это был атрибут - вы бы использовали [@CODE= в XPath

Nigel Ren 25.06.2018 17:41

Пожалуйста, уточните, что «не сработало». Покажите нам минимальный воспроизводимый пример - небольшой документ, который мы действительно можем протестировать, с желаемым выводом, соответствующим кодом (нам не нужно знать о $url и $struct) и выводом, который вы получили.

IMSoP 25.06.2018 19:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Результатом выражения 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;

Другие вопросы по теме