Это не так сложно с выражениями DOM и Xpath:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
// iterate STOK element nodes
foreach ($xpath->evaluate('/ROOT/STOKLAR/STOK') as $stok) {
// fetch first SKU child element node as string
var_dump($xpath->evaluate('string(SKU)', $stok));
// iterate OZELLIK element nodes in OZELLIKLER
foreach ($xpath->evaluate('OZELLIKLER/OZELLIK', $stok) as $ozellik) {
var_dump(
// content of current OZELLIK
$ozellik->textContent,
// first following sibling element node, if DEGER, as string
$xpath->evaluate('string((./following-sibling::*)[1][self::DEGER])', $ozellik)
);
}
}
Вывод:
string(4) "1234"
string(22) "Ekran Kartı Belleği "
string(14) "Paylaşımlı "
string(4) "1454"
string(21) "İşlemci Üreticisi "
string(6) "Intel "
string(15) "İşlemci Tipi "
string(14) "Intel Core i5 "
DOMXpath::evaluate()
может возвращать список узлов или скалярное значение в зависимости от выражение. Второй аргумент устанавливает узел контекста для выражения. Вот объяснение последнего (самого сложного) выражения:
- Получите следующие узлы родственного элемента
following-sibling::*
- Ограничение до первого найденного узла
(following-sibling::*)[1]
- Фильтр по имени узла DEGER
(following-sibling::*)[1][self::DEGER]
- Возвращает текстовое содержимое этого узла, пустую строку, если узел не был найден
string((following-sibling::*)[1][self::DEGER])
По умолчанию выражения работают на «дочерней» оси. В выражении используются две другие оси: «follow-sibling» и «self» для поиска необходимых узлов.