Наверное, я очень глупо сформулировала свой вопрос, но сделала все, что могла, заранее извиняюсь)
У меня есть XML-файл. Мне нужно запустить такой запрос:
$xml->shop->offers->offer
Проблема в том, что я получаю этот путь из переменной:
$path = 'shop->offers->offer'
Но это не будет работать так:
$xml = simplexml_load_file('example.com');
$exampleElement = $xml->$path;
Как я могу исправить код, чтобы он работал?
Взгляните на XPath, он использует нечто подобное.
@barmar, не могли бы вы показать на примере? Я разделю массив, но как мне использовать foreach в этом запросе? $path = explode( "->", $path);






Вы можете разделить путь на его компоненты и циклично просматривать их для навигации по объекту SimpleXML.
Один из способов сделать это — использовать взрыв(). Это встроенная функция PHP, используемая для разделения строки на массив подстрок на основе указанной подстроки, по которой будет разбита входная строка. В этом случае его можно использовать для разделения пути, хранящегося в переменной $path, на массив компонентов, которые затем используются для перемещения по структуре XML.
https://www.php.net/manual/en/function.explode.php
Вы могли бы попробовать...
// Split the path into its components
$pathComponents = explode('->', $path);
// Start with the root element
$currentElement = $xml;
// Loop thru the path components and navigate thru the XML
foreach ($pathComponents as $component) {
if (isset($currentElement->$component)) {
$currentElement = $currentElement->$component;
} else {
// You can throw an exception or handle it according to your needs
// in this example, I just broke out of the loop
break;
}
}
// $currentElement should now contain the desired XML element
https://www.php.net/manual/en/function.isset.php
Ну, это то, что я сделал. $path = explode( "->", $path); Что дальше?)) Как использовать foreach?
Только что обновленный ответ.
Разделите путь, а затем пройдите по нему, получая каждое вложенное свойство.
$props = explode("->", $path);
$el = $xml;
foreach ($props as $prop) {
$el = $el->$prop;
}
var_dump($el);
Разделите строку на массив, используя метод разнесения. Затем используйте цикл, чтобы получить каждое вложенное свойство, используя этот список.