Как упоминалось в ответе Шёрда, $block
не является массивом. SimpleXMLElement :: xpath () возвращает массив объектов, каждый из которых представляет один элемент. Таким образом, по сути, вы должны заменить $block[0]
на $block
, так как он уже представляет блок, который вы ищете.
Кроме того, я переписал ваше выражение XPath. Поскольку вы ищете элемент <data:Block/>
, это то, на что вы должны ориентироваться. Что касается <data:Code/>
, это предикат, поэтому он должен заключаться в квадратные скобки. Конечно, в вашем случае результат тот же, но рекомендуется иметь семантически правильные выражения, помогая получить более четкое представление о том, что происходит позже, когда вы перечитываете этот код (или если кто-то другой должен его поддерживать)
foreach ($xml->xpath('//data:Block[data:Code="Fbf"]') as $block) {
foreach ($block->Fields->Field as $field) {
echo "Code: ". $field->Code ."\n"; // SHould return FinnsIFbf
}
}
Обновление
Я не заметил, что вы сказали, что все, что вас интересовало, это элемент <Field/>
. В этом случае вы можете получить его напрямую через XPath: (помните, что все они находятся в пространстве имен данных)
foreach ($xml->xpath('//data:Block[data:Code="Fbf"]/data:Fields/data:Field') as $field) {
echo "Code: ". $field->Code ."\n"; // SHould return FinnsIFbf
}