$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'); echo '<pre>'; print_r($nodes); 

result

 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) ) ) ) ) 

)

Suggest as attribute to get or return the object in the form

  [param] => Array( [пол] => Для женщин [тип изделия] => Платье [Основной цвет] => Фиолетовый [Материал] => Хлопок ) 

    1 answer 1

    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) ) ) ) )