Unfortunately, by default, the functions simplexml_load_file() and simplexml_load_string() do not have the ability to substitute attributes as keys. However, this can be done artificially after the XML file has been parsed. To do this, simply add the missing elements using the addChild() method.
<?php $xmlData = '<?xml version="1.0" encoding="UTF-8"?> <yml_catalog date="2015-11-30 10:01"> <shop> <offers> <offer id="10933" available="true"> <params> <param name="Пол"><![CDATA[Для женщин]]></param> <param name="Тип изделия"><![CDATA[Платье]]></param> <param name="Основной цвет"><![CDATA[Фиолетовый]]></param> <param name="Материал"><![CDATA[Хлопок]]></param> </params> <sizes> <size id="18394"><![CDATA[S (36-eu, 42-ru)]]></size> <size id="18395"><![CDATA[M (38-eu, 44-ru)]]></size> </sizes> </offer> </offers> </shop> </yml_catalog>'; $xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA); $nodes = $xml->xpath('//shop/offers'); foreach($nodes as $node) { foreach($node->offer->params->param as $key => $value) { $node->offer->params->addChild($value['name'], $value); } foreach($node->offer->sizes->size as $key => $value) { $node->offer->sizes->addChild($value['id'], $value); } } echo '<pre>'; print_r($nodes);
The result will be the following structure.
Array ( [0] => SimpleXMLElement Object ( [offer] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 10933 [available] => true ) [params] => SimpleXMLElement Object ( [param] => Array ( [0] => Для женщин [1] => Платье [2] => Фиолетовый [3] => Хлопок ) [Пол] => Для женщин [Тип изделия] => Платье [Основной цвет] => Фиолетовый [Материал] => Хлопок ) [sizes] => SimpleXMLElement Object ( [size] => Array ( [0] => S (36-eu, 42-ru) [1] => M (38-eu, 44-ru) ) [18394] => S (36-eu, 42-ru) [18395] => M (38-eu, 44-ru) ) ) ) )