
/** Работаем с OFFER-ами **/
foreach ($xml_slave->xpath('//offer') as $key => $item) {
    $param      = $item->param; // param OFFERa slave
    $categoryId = $item->categoryId; // categoryId OFFERa slave
    //TODO-sasha Если НЕ найден артикул из проверяемого файла в мастере то переносим в файл-результат объект offer, его атрибуты, а также дочерние элементы. Важно!!! При копировании заменяем id категории на значение из мастера
    if (sizeof(search_offer($xml_master, $param)) == 0) {
        $offer = $xml3->shop[0]->offers->addChild('offer');
        $offer_attributes = element_attributes($item->attributes());
        /** Добавляем аттрибуты к offer **/
        foreach ($offer_attributes as $key_a => $item_a) {
            $offer->addAttribute($key_a, $item_a);
        }
        /** Работа с элементами OFFER-a **/
        foreach ($item as $key_off => $off) { //перебираем элементы OFFER-a
            $offer->addChild($key_off, $off);
            /** Работа с элементом category **/
       
            /** Добавляем аттрибуты к дочерним элементам offer **/
            $offer->addChild($key_off, $off);
            $offer->$key_off->addAttribute('ddd', 'eee');
           
        }
    }
}        foreach ($item as $key_off => $off) {
            $offer->addChild($key_off, $off);
            $offer->addChild($key_off, $off); // повтор?? теперь есть минимум 2 элемента $key_off
            $offer->$key_off->addAttribute('ddd', 'eee'); // и в какой из них мы добавляем?
        }PHP:$child = $offer->addChild($key_off, $off); $child->addAttribute('тест', 'тест1');
Там проверка была - я при подготовке кода убрал, а строка осталась.PHP:foreach ($item as $key_off => $off) { $offer->addChild($key_off, $off); $offer->addChild($key_off, $off); // повтор?? теперь есть минимум 2 элемента $key_off $offer->$key_off->addAttribute('ddd', 'eee'); // и в какой из них мы добавляем? }

<param code="article" name="Артикул">a_chl_sam_ga3_2016_svw_cvr_wht</param>
<param code="867549" name="Цвет">White - Белый</param>foreach ($attributes_by_element as $key_atr => $attr) {
                    $child->addAttribute($key_atr, $attr);
                }<param code="article" name="Артикул">a_chl_sam_ga3_2016_svw_cvr_wht</param>
<param code="article" name="Артикул">White - Белый</param>что есть $child?Код:foreach ($attributes_by_element as $key_atr => $attr) { $child->addAttribute($key_atr, $attr); }
/** Создаёт результирующий XML файл из мастера и подчинённого файлов.**/
function create_res_xml($xml_master, $xml_slave, $xml_res) {
    global $path_cat1;
    global $path_cat2;
    global $path_cat3;
    global $xml2;
    global $xml3;
    global $offer;
    /** Работаем с OFFER-ами **/
    foreach ($xml_slave->xpath('//offer') as $key => $item) {
        $param      = $item->param; // param OFFERa slave
        $categoryId = $item->categoryId; // categoryId OFFERa slave
        //TODO-sasha Если НЕ найден артикул из проверяемого файла в мастере то переносим в файл-результат объект offer, его атрибуты, а также дочерние элементы. Важно!!! При копировании заменяем id категории на значение из мастера
        if (sizeof(search_offer($xml_master, $param)) == 0) {
            $offer = $xml3->shop[0]->offers->addChild('offer');
            $offer_attributes = element_attributes($item->attributes());
            /** Добавляем атрибуты к offer **/
            foreach ($offer_attributes as $key_a => $item_a) {
                $offer->addAttribute($key_a, $item_a);
            }
            /** Работа с элементами OFFER-a **/
            foreach ($item as $key_off => $off) { //перебираем элементы OFFER-a
                /** Работа с элементом category **/
                if ($key_off == strval('categoryId')) {
                    $name_cat_slave = category_name_by_id($path_cat2, strval($off));
                    $id_cat_master = category_id_by_name($path_cat1, strval($name_cat_slave));
                    if (isset($id_cat_master)) {
                        //TODO-sasha Получили id в мастере, соответствующее текущему значению id slave
                        $child = $offer->addChild($key_off, strval($id_cat_master));
                    } else {
                        //TODO-sasha Получили id slave, поскольку в мастере нет похожей категории
                        $child = $offer->addChild($key_off, strval($off));
                    }                  
                } else {
                    $child = $offer->addChild($key_off, strval($off));
                }
                /** Добавляем атрибуты к дочерним элементам OFFER-а **/
                $attributes_by_element = $xml2->shop[0]->offers[0]->offer[$key]->$key_off->attributes();
                foreach ($attributes_by_element as $key_atr => $attr) {
                    $child->addAttribute($key_atr, $attr);
                }
            }
        }
    }
} // function create_res_xmlПостоянно пользуюсь данными функциями.если чесно, мне сложно понять, если у тебя в голове не складывается что есть
то у меня тем более. есть такие функции print_r, var dumpPHP:$xml2->shop[0]->offers[0]->offer[$key]->$key_off->attributes();
дампи, разбирайся.
ну тожда должен четко понимать, чтоПостоянно пользуюсь данными функциями
$xml2->shop[0]->offers[0]->offer[$key]->$key_off$key_off и перебирается - это массив элементов (названия элементов дочерних) И у них атрибуты считываютсяну тожда должен четко понимать, что
является массивом элементов (на момент ошибки), что это необходимо было учестьКод:$xml2->shop[0]->offers[0]->offer[$key]->$key_off
не батенька, перебирается $key_off->attributes()$key_off и перебирается
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <stores>
    <store uid="111" name="444"/>
    <store uid="222" name="555"/>
    <store uid="333" name="666"/>
  </stores>
</catalog>function copyChildren($src, $dstn){
  foreach($src->children() as $child){
    $tmp = $dstn->addChild($child->getName());
    foreach($child->attributes() as $name => $value){
      $tmp->addAttribute($name, $value);
    }
    copyChildren($child, $tmp);
  }
}$xml = simplexml_load_string(file_get_contents('file1.xml'));
$xmlCopy = new SimpleXMLElement('<catalog />');
copyChildren($xml, $xmlCopy);
file_put_contents('file2.xml', $xmlCopy->asXML() );Да, Ваш пример работает. Спасибо огромное. Пробую у себя реализовать!PHP:function copyChildren($src, $dstn){ foreach($src->children() as $child){ $tmp = $dstn->addChild($child->getName()); foreach($child->attributes() as $name => $value){ $tmp->addAttribute($name, $value); } copyChildren($child, $tmp); } }PHP:$xml = simplexml_load_string(file_get_contents('file1.xml')); $xmlCopy = new SimpleXMLElement('<catalog />'); copyChildren($xml, $xmlCopy); file_put_contents('file2.xml', $xmlCopy->asXML() );
согласен, и функцию задом наперед переписать (про корневые аттрибуты забыл)
function xmlCopy($src, $dstn){
  foreach($src->attributes() as $name => $value){
    $dstn->addAttribute($name, $value);
  }
  foreach($src->children() as $child){
    xmlCopy($child, $dstn->addChild($child->getName()));
  }
  return $dstn;
}
file_put_contents(
    'file2.xml',
    xmlCopy(
        simplexml_load_file('file1.xml'),
        new SimpleXMLElement('<catalog-copy />')
    )->asXML()
);